【问题标题】:SQL create enum as column and group by dateSQL将枚举创建为列并按日期分组
【发布时间】:2021-11-03 12:03:27
【问题描述】:

我有一张像下面这样的表格

id folder_num category date
1 100/2021 add 8/25/2021 20:58
2 200/2021 delete 8/25/2021 21:02
3 300/2021 add 8/25/2021 21:06
4 400/2021 add 8/25/2021 21:10
5 500/2021 delete 8/26/2021 21:14
6 600/2021 edit 8/26/2021 21:18
7 700/2021 edit 8/27/2021 21:22
8 800/2021 edit 8/27/2021 21:26
9 900/2021 edit 8/27/2021 21:30
10 1000/2021 add 8/27/2021 21:34

category是一个枚举类型的列,我想把枚举的内容做成一个列并按日期分组。

我之前根据categorydate 创建了一个分组,结果如下。

SELECT c.category, 
        COUNT(l.id) total,  
        d.date as date
 FROM (SELECT DISTINCT category FROM log) c
 CROSS JOIN (SELECT DISTINCT DATE(date) date FROM log WHERE DATE(date) BETWEEN '2021-08-01' AND '2021-08-30') d
 LEFT JOIN log l ON l.category = c.category AND DATE(l.date) = d.date
 GROUP BY c.category, d.date
 ORDER BY c.category ASC
category total date
add 3 8/25/2021
delete 1 8/25/2021
edit 0 8/25/2021
add 0 8/26/2021
delete 1 8/26/2021
edit 1 8/26/2021
add 1 8/27/2021
delete 0 8/27/2021
edit 3 8/27/2021

结果还算满意,但回到我的问题,我想把category列中的值变成一列而不是一行,结果是这样的

date add delete edit
8/25/2021 3 1 0
8/26/2021 0 1 1
8/27/2021 1 0 3

我尝试使用 max(case ...) 函数但代码错误,这是我尝试过的

SELECT 
        d.date as date,
        max(case when d.category = 'add' then COUNT(l.id) else null end) as add,
        max(case when d.category = 'delete' then COUNT(l.id) else null end) as delete,
        max(case when d.category = 'edit' then COUNT(l.id) else null end) as edit
 FROM (SELECT DISTINCT category FROM log) c
 CROSS JOIN (SELECT DISTINCT DATE(date) date FROM log WHERE DATE(date) BETWEEN '2021-08-01' AND '2021-08-30') d
 LEFT JOIN log l ON l.category = c.category AND DATE(l.date) = d.date
 GROUP BY d.date

我的查询中函数的使用是否放错了位置?谢谢

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你不能嵌套聚合函数,但你可以简单地使用:

    SELECT date(l.date) as date,
           sum(l.category = 'add') as add,
           sum(l.category = 'delete') as delete,
           sum(l.category = 'edit') as edit
    FROM log l
    WHERE l.date >= '2021-08-01' AND l.date < '2021-08-31'
    GROUP BY l.date
    

    【讨论】:

    • 谢谢,对我有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多