【问题标题】:Subquery or join to match 2 tables on 2 fields on a range of values子查询或连接以匹配值范围内 2 个字段上的 2 个表
【发布时间】:2015-07-09 18:53:39
【问题描述】:

我希望对于每个唯一的 pur_datesproduct_sold 字段中的项目数等于 product 字段中的项目,其中 chk_datepur_date 的 31 天内除以 @987654326 的总数@ 在这 31 天内。

两个重要条件是product_sold 中的项目等于product 中的项目,并且要使匹配有效,table2 中的日期范围必须在 table1 的一个月内。

product 字段是唯一的,而product_sold 字段可以有重复的产品。 pur_date 字段仅随年份和月份变化。

Table1
    pur_date      product
    2015-07-01    shirt
    2015-06-01    shoe
    2015-04-01    purse
    2015-04-01    bag
    2014-05-01    key
    2015-05-01    gloves

Table2
chk_date     cost  product_sold
2015-07-29     9    bag
2015-07-15    10    shoe
2015-06-30     8    shirt
2014-06-25     6    bag
2015-06-01     9    shirt
2015-05-28     8    shoe
2015-05-15     4    key
2015-04-28     5    shirt
2015-03-15     6    purse
2015-03-15     4    ring
2015-03-10     4    key
2015-03-01     2    bag

我有一个不工作的子查询来做这样的事情:

        Select pur_date,
        (Select SUM(CASE WHEN product_sold IN (select product from table1) THEN 1 ELSE 0 END)/COUNT(product_sold) 
        from table2
        where (pur_date - chk_date) <=31) AS percent_sold 
        from (select distinct pur_date from table1) t;

我得到的错误是:Illegal expression in WHEN clause of CASE

例子:

output_table
pur_date   num_product_match
2015-07-01    2/3       <--for the 3 product_sold in June,2 items(shirt) match product = shirt
2015-06-01    1/2       <-- for the 2 product_sold in May,1 item(shoe) match product = shoe  
2015-05-01    1/1       <-- for th 1 product_sold in April, 1 item(shirt) match product = shirt
2015-04-01    2/4       <-- for the 4 product sold in March, 2 item(purse, bag) match product = purse and product = bag

【问题讨论】:

  • 问题尚不清楚......它如何决定使用哪种产品作为馏分的顶部?你在哪里指出那是什么产品?
  • 只要product_soldproduct 匹配,并且在一个月前productpur_date 之内,我们就总结了。我们不关心它是什么产品,只关心匹配的数量。 product 列是唯一的。
  • 但显然不止一种产品会匹配。如果您有一行显示2015-07-01 2/3,从逻辑上讲,您必须还有另一行显示2015-07-01 1/3。但是您的样本结果并不能证明这一点。哪个产品与哪一排搭配?对于您的 3 月示例,查询应该将 purse 和 bag 组合在一起的原因是什么?
  • 好吧,没关系。我现在更好地看到了这些表是如何匹配的。但是这个问题根本就不清楚。
  • 我希望它现在稍微清楚一点。

标签: mysql sql join subquery


【解决方案1】:
SELECT pd.pur_date, 
    SUM(CASE WHEN t1.product IS NOT NULL THEN 1 ELSE 0 END) / 
    CAST(COUNT(t2.product_sold) as float)  As num_product_match    
FROM (SELECT DISTINCT pur_date FROM Table_1) pd
INNER JOIN Table_2 t2 ON t2.chk_date < pd.pur_date 
    AND t2.chk_date >= DATE_ADD(pd.pur_date, INTERVAL -1 MONTH)
LEFT JOIN Table_1 t1 ON t1.pur_date > t2.chk_date 
    AND t1.pur_date <= DATE_ADD(t2.chk_date, INTERVAL 1 MONTH) 
    AND t1.product = t2.product_sold
GROUP BY pd.pur_date

【讨论】:

  • 我并不真的需要 '\' 符号,我只是想解释一下我是如何获得其中的价值的。该值应为浮点数,因此 1/2 为 0.5。
  • 编辑为使用除法而不是字符串...但我真的建议将分子和分母作为单独的列返回。
  • 抱歉需要一些帮助理解,既然你已经提到chk_date &gt;= DATE_ADD(pd.pur_date, INTERVAL -1 MONTH),为什么还要指定t2.chk_date pur_date - chk_date <= 31 And pur_date - chk_date > 0?
  • 不,我们不能那样做。如果您删除第二张支票,您还将匹配未来几个月销售的产品。此外,并非所有月份都有 31 天。使用标准的 DATE 函数……它们的存在是有原因的。
  • 第8行:AND t2.pur_date &lt;= DATE_ADD(t2.chk_date, INTERVAL 1 MONTH)pur_datetable_1,你用t2.pur_date对吗?
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多