【发布时间】: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是一个枚举类型的列,我想把枚举的内容做成一个列并按日期分组。
我之前根据category 和date 创建了一个分组,结果如下。
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
我的查询中函数的使用是否放错了位置?谢谢
【问题讨论】: