MySQL 结果按日期

标签 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

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/

相关文章:

php - Laravel wherebetween 不接受负数

mysql - 当数据重复且我没有时间戳时避免重复插入的建议

php - 尝试开发一个搜索引擎,我的代码有错误

mysql - 主机 'xxx.xx.xxx.xxx' 不允许连接到这个 MySQL 服务器

javascript - 从 PHP 和 JQuery 连接到 mySQL 服务器

java - 如何指定JPA连接列名称?

mysql - 在 sql 触发器中设置和比较变量的正确方法是什么

mysql - 在 Cordova/Ionic 应用程序中通过 USB 在桌面移动设备之间同步数据

mysql - 如何修复此查询?

mysql - 在 REPLACE 上增加字段值