You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

当前错误输出

numberday1_statusday2_statusday3_statusday4_status
10activenullnullnull
20activenullnullnull

期望输出

numberday1_statusday2_statusday3_statusday4_status
10activenoactiveno
20activeactivenoactive

数据表结构及数据

idnumberstatusdate
110active2022-08-22
210no2022-08-23
310active2022-08-24
410no2022-08-25
520active2022-08-22
620active2022-08-23
720no2022-08-24
820active2022-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:45:43