【问题标题】:MySQL query to get item counts per month - displayed in row for each itemMySQL 查询以获取每月的项目计数 - 显示在每个项目的行中
【发布时间】:2021-04-30 19:26:47
【问题描述】:

我有这样的MySQL表(实际场景中会有更多的项目):

ID item date
1 a 2021-04-01
2 a 2021-04-05
3 a 2021-05-07
4 b 2021-07-09

我想创建一个表格(结果将显示在 HTML 表格中),其中 每个唯一项目 名称将有 一行 并且还有 counts of全年每个月的项目。因此,上述案例的结果将如下所示:

item m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12
a 0 0 0 2 1 0 0 0 0 0 0 0
b 0 0 0 0 0 0 1 0 0 0 0 0

我可以通过 2 个单独的 SELECT 查询来做到这一点,其中第二个查询可能在 for 循环中,但我无法弄清楚如何在一个 SELECT 或一个多选查询,如果可能的话。

我只走了那么远,然后就卡住了:

SELECT MONTH(date) as m, COUNT(item) as c
FROM itemtable 
WHERE YEAR(date)=YEAR(CURRENT_DATE()) AND item="a" 
GROUP BY MONTH(date) 

【问题讨论】:

  • 考虑处理应用代码中数据显示的问题
  • @CaiusJard 不,这只是强调我想要成行。删除它。谢谢

标签: mysql select


【解决方案1】:

这是一个枢轴操作。在 MySQL 中,我通常通过条件聚合来实现:

SELECT item,
  SUM(CASE WHEN MONTH(date) = 1 THEN 1 ELSE 0 END) as m1, 
  SUM(CASE WHEN MONTH(date) = 2 THEN 1 ELSE 0 END) as m2, 
  ...
  SUM(CASE WHEN MONTH(date) = 12 THEN 1 ELSE 0 END) as m12
FROM itemtable 
WHERE date BETWEEN '2021-01-01' and '2021-12-31'
GROUP BY item

要查看其工作原理,请删除 SUM/GROUP BY 并查看原始 CASE WHEN - 它将数据拆分为对角线的 12 列,然后 sum/group 将其压缩为一行:

   A           A           A B C
   B     ->      B     ->
   C               C

我同意草莓的看法,即这通常最好在应用程序代码而不是数据库中处理,但由于数据固定在“第 1 个月”到“第 12 个月”,因此在数据库中处理起来相对容易

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多