【问题标题】:SELECT COUNT(table.column) - for every month, giving a column per monthSELECT COUNT(table.column) - 每个月,每个月给出一列
【发布时间】: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 未知?

标签: mysql sql date


【解决方案1】:

您需要宽格式输出,因此应该使用数据透视查询:

SELECT
    reason,
    COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = '2021-01' THEN 1 END) AS "2021/01",
    COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = '2021-02' THEN 1 END) AS "2021/02",
    COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = '2021-03' THEN 1 END) AS "2021/03",
    COUNT(CASE WHEN DATE_FORMAT(date, '%Y-%m') = '2021-04' THEN 1 END) AS "2021/04"
FROM cases
GROUP BY reason;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多