2014-09-01 68 views
1

也许有一个简单的修复方法,但是我无法搞清楚。我会尽我所能解释我的情况。按日期排列的MySQL结果

我正在开发一个MySQL查询,它将返回日期范围内(A列中)和日期范围-1年(B列中)的结果。我需要按月份将结果分组,而不是按年份分组。所以,我想有这样的事情:

 
     2014  2013 
     ---------------- 
01-01  6   8 
01-03  7   0 
01-04  4   1 
01-08  0   13 
01-21  11   7 

在我目前的查询(下)我得到(如果因ELSE)这样的结果:

 
     2014  2013 
     ---------------- 
01-01  0   8 
01-03  7   0 
01-04  0   1 
01-08  0   13 
01-21  0   7 

QUERY:

SELECT 
DATE_FORMAT(table.date, '%e.%c.') AS date, 
(CASE WHEN DATE(table.date) BETWEEN '2014-01-01' AND '2014-02-01' THEN ROUND(SUM(table.field), 2) ELSE 0 END) AS field_2014, 
(CASE WHEN DATE(table.date) BETWEEN '2013-01-01' AND '2013-02-01' THEN ROUND(SUM(table.field), 2) ELSE 0 END) AS field_2013 

FROM table 

WHERE 
(DATE(table.date) BETWEEN '2014-05-01' AND '2014-06-01' OR DATE(table.date) BETWEEN '2013-05-01' AND '2013-06-01') 

GROUP BY 
DATE_FORMAT(table.date, '%c.%e.')

我应该在ELSE中放什么,我该如何实现这个功能?

谢谢你的时间

+0

尝试使用总和外,这是'sum(case(..))'的情况下' – senK 2014-09-01 12:04:40

+0

thnx为您的帮助senk!它确实让我走上了正确的道路 – kiflica 2014-09-01 12:55:27

回答

1

你需要聚合函数。我会推荐:

SELECT DATE_FORMAT(t.date, '%e.%c.') AS date, 
     SUM(CASE WHEN year(t.date) = 2014 THEN ROUND(SUM(t.field), 2) ELSE 0 END) AS field_2014, 
     SUM(CASE WHEN year(t.date) = 2013 THEN ROUND(SUM(t.field), 2) ELSE 0 END) AS field_2013 
FROM table t 
WHERE year(t.date) in (2013, 2014) and month(t.date) = 5 
GROUP BY DATE_FORMAT(t.date, '%c.%e.'); 

我也推荐使用格式'%m-%d'。有一个月然后一年意味着order by将在该列上工作。使所有日期具有相同的宽度(“05/01”而不是“5/1”)更符合您的期望输出。

+0

谢谢Gordon,你的榜样帮了我很多。我确实设法在您和senk的帮助下实现所需的功能。 TY – kiflica 2014-09-01 12:56:49