【发布时间】:2022-01-11 15:38:34
【问题描述】:
我有一个 mysql 表 cases,看起来像这样:
person_id reason date
01 abc 2021-11-23 00:00:00
02 def 2021-11-23 00:00:00
01 ghi 2021-12-03 00:00:00
03 abc 2021-10-23 00:00:00
01 def 2021-11-23 00:00:00
我想统计reason 的数量,每个月,每个月都有一个专栏,比如说过去 12 个月:
reason 2021/01 2021/02 2021/03 2021/04 ...
abc 125 255 111 189 ...
def 364 846 215 792 ...
ghi 251 700 251 105 ...
到目前为止,我得到的是这个 SELECT,它返回无数行,我不知道从这里去哪里:
SELECT MONTH(cases.date) , cases.reason, COUNT(cases.reason)
FROM cases
WHERE cases.date >= NOW() - INTERVAL 1 YEAR
GROUP BY MONTH(cases.date), cases.reason
根据我按照 sql SELECT 构建的 Tim 的回答,它并不完美,但对我来说已经足够好了:
SELECT
reason,
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 11 MONTH), '%Y-%m') THEN 1 END) AS "11 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 10 MONTH), '%Y-%m') THEN 1 END) AS "10 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 9 MONTH), '%Y-%m') THEN 1 END) AS "9 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 8 MONTH), '%Y-%m') THEN 1 END) AS "8 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 7 MONTH), '%Y-%m') THEN 1 END) AS "7 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 6 MONTH), '%Y-%m') THEN 1 END) AS "6 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 5 MONTH), '%Y-%m') THEN 1 END) AS "5 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 4 MONTH), '%Y-%m') THEN 1 END) AS "4 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 3 MONTH), '%Y-%m') THEN 1 END) AS "3 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 2 MONTH), '%Y-%m') THEN 1 END) AS "2 months ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(date_sub(now(), INTERVAL 1 MONTH), '%Y-%m') THEN 1 END) AS "1 month ago",
COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = date_format(now(), '%Y-%m') THEN 1 END) AS "this month"
FROM cases
GROUP BY reason;
【问题讨论】:
-
标记您使用的 DBMS。
-
为什么要将日期作为列名?那是一个 SQL 反模式。这样做的 SQL 方法是,一列原因,一列月份,一列计数;给出 36 (3 个原因 * 12 个月) 行结果。
-
@MatBailie 作为表格设计,这是一种反模式,但作为报告要求,它可能很常见。
-
mysql.确切地说,我需要它来做报告,到目前为止我都是手工做的,这花了我很长时间。
-
是过去 12 个月还是过去 n 个月,其中 n 未知?