在MySQL中计算两个表,并根据另一个表中的日期显示结果

时间:2015-01-20 14:28:18

标签: mysql sql

我想计算两个表中的记录数,并根据其中一个计数表的日期将它们组合在一起。

目前,我有这个问题:

SELECT COUNT(DISTINCT efu.id) AS TotalCollections, COUNT(DISTINCT ccs.id) AS TotalCases, efu.completion_date
FROM enviro_figures_upload efu
LEFT JOIN customer_cases_upload ccs ON ccs.customer_site = efu.customer_site
WHERE efu.customer_site = "TGI Friday's Glasgow" 
GROUP BY DATE_FORMAT(efu.completion_date, '%m-%Y') DESC
ORDER BY YEAR(efu.completion_date) ASC, MONTH(efu.completion_date) ASC

其中输出以下结果:

TotalCollections    TotalCases  completion_date
      52                 8         2014-05-21
      73                 8         2014-06-23
      83                 8         2014-07-02
      89                 8         2014-08-22
      87                 8         2014-09-21
      68                 8         2014-10-06
      85                 8         2014-11-20
      59                 8         2014-12-10
      17                 8         2015-01-05

但是,TotalCases列未被正确计算。该表中共有8条记录,但在查询中,应根据日期计算案例数(也称为completion_date)。有些情况TotalCases将返回0,但应包含TotalCollectionscompletion_date

所以真的应该是:

TotalCollections    TotalCases  completion_date
      52                 2         2014-05-21
      73                 1         2014-06-23
      83                 1         2014-07-02
      89                 0         2014-08-22
      87                 0         2014-09-21
      68                 1         2014-10-06
      85                 0         2014-11-20
      59                 2         2014-12-10
      17                 1         2015-01-05

我该怎么做?

修改
以下是enviro_figures_upload表中的一些示例数据:

id      completion_date
124114  2014-09-30
124134  2014-10-31
124146  2014-05-23
124148  2014-05-24
124149  2014-05-26
124150  2014-05-27
124151  2014-05-28
124152  2014-05-25
124153  2014-05-29
124193  2014-05-31
124194  2014-05-24
124195  2014-05-26
124196  2014-05-27
124197  2014-05-28

以下是customer_cases_upload的一些示例数据:

id      completion_date
2519    2014-10-17
2520    2014-12-15
2521    2014-07-28
2522    2014-12-12
2523    2014-09-27
2524    2014-11-03
2525    2014-05-30
2526    2014-05-22

2 个答案:

答案 0 :(得分:1)

TotalCases显示8,因为customer_cases_upload.completion_date没有约束。

尝试:

SELECT COUNT(DISTINCT efu.id) AS TotalCollections, COUNT(DISTINCT ccs.id) AS TotalCases, efu.completion_date
FROM enviro_figures_upload efu
LEFT JOIN customer_cases_upload ccs ON ccs.customer_site = efu.customer_site 
  and year(efu.completion_date) = year(css.completion_date) 
  and month(efu.completion_date) = month(css.completion_date)
WHERE efu.customer_site = "TGI Friday's Glasgow" 
GROUP BY DATE_FORMAT(efu.completion_date, '%m-%Y')
ORDER BY YEAR(efu.completion_date) ASC, MONTH(efu.completion_date) ASC

答案 1 :(得分:0)

我不太确定customer_site列是什么,因为该列未包含在您的示例数据中,但我认为您的LEFT JOIN需要更具体。对于WHERE子句中引用的customer_site,customer_cases_upload表中总共有8条记录。无论completion_date如何,LEFT JOIN都会将所有8条记录连接到enviro_figures_upload表的每一行。 customer_cases_upload completion_date是否与相应的enviro_figures_upload completion_date匹配?如果是这样,请在LEFT JOIN的ON子句中包含此内容,仅将customer_cases_upload行连接到具有相同completion_date的enviro_figures_upload行。