也许有一个简单的修复方法,但我无法弄清楚。我会尽力解释我的情况。
我正在处理一个 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
In my current query (below) I get results like this (because of ELSE in CASE):
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 中输入什么以及如何实现此功能?
谢谢你的时间
最佳答案
您需要聚合函数。我会推荐:
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”)更符合您想要的输出。
关于MySQL 结果按日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25605364/