使用MySQL创建数据透视表无法得到正确输出的问题
解决MySQL透视表仅显示单日数据的问题
尝试根据日期范围获取记录并以透视表格式展示,但仅能获取单日数据,其余日期的记录显示为null。
原查询语句
SELECT number, if(date= '2022-08-22', status, null) day1_status, if(date= '2022-08-23', status, null) day2_status, if(date= '2022-08-24', status, null) day3_status, if(date= '2022-08-25', status, null) day4_status from table where date BETWEEN '2022-08-22' and '2022-08-25' GROUP by number
当前错误输出
| number | day1_status | day2_status | day3_status | day4_status |
|---|---|---|---|---|
| 10 | active | null | null | null |
| 20 | active | null | null | null |
期望输出
| number | day1_status | day2_status | day3_status | day4_status |
|---|---|---|---|---|
| 10 | active | no | active | no |
| 20 | active | active | no | active |
数据表结构及数据
| id | number | status | date |
|---|---|---|---|
| 1 | 10 | active | 2022-08-22 |
| 2 | 10 | no | 2022-08-23 |
| 3 | 10 | active | 2022-08-24 |
| 4 | 10 | no | 2022-08-25 |
| 5 | 20 | active | 2022-08-22 |
| 6 | 20 | active | 2022-08-23 |
| 7 | 20 | no | 2022-08-24 |
| 8 | 20 | active | 2022-08-25 |
问题原因
GROUP BY number后,每个分组包含多条对应不同日期的记录,但原查询中if语句未使用聚合函数,MySQL会默认取分组内第一条记录的计算结果,导致仅第一个日期的status被保留,其余日期显示为null。
修正后的查询语句
用MAX()聚合函数包裹每个if语句——每个日期对应唯一的status,MAX()会忽略null值,提取分组内对应日期的有效status:
SELECT number, MAX(if(date= '2022-08-22', status, null)) day1_status, MAX(if(date= '2022-08-23', status, null)) day2_status, MAX(if(date= '2022-08-24', status, null)) day3_status, MAX(if(date= '2022-08-25', status, null)) day4_status from table where date BETWEEN '2022-08-22' and '2022-08-25' GROUP by number
补充说明
也可以用MIN()替代MAX(),效果完全一致——因为每个日期对应的status在分组内只有一个非null值,聚合函数会直接返回该值,最终得到期望的透视表格式。
内容的提问来源于stack exchange,提问作者karishma upadhyay
相关产品推荐
相关产品推荐

