MySQL如何实现事件执行表查询结果按日期拆分为多列?
解决方案
你需要用**行转列(宽表转换)**的逻辑修改SQL,以下是两种兼容不同SQL引擎的实现方式:
通用方案(兼容所有SQL引擎)
用CASE WHEN加聚合函数实现,不需要依赖引擎特有的语法:
SELECT a.Event_ID, b.Name, -- 按日期匹配统计客户数,不匹配的返回NULL会被COUNT自动忽略 COUNT(CASE WHEN Event_Execution_Date_ID = '20211006' THEN a.Customer_Id END) AS `20211006`, COUNT(CASE WHEN Event_Execution_Date_ID = '20211007' THEN a.Customer_Id END) AS `20211007` FROM UNLIMITED.Event_Execution a JOIN UNLIMITED.Event_Master b ON a.Event_Id = b.ID -- 保留你需要统计的所有日期范围 WHERE Event_Execution_Date_ID IN ('20211006', '20211007') -- 严格模式下需要把查询的非聚合字段都加入GROUP BY GROUP BY a.Event_ID, b.Name ORDER BY `20211007` DESC;
如果需要输出带千分位的数值格式,可以对应加格式化函数:
- MySQL/Spark SQL:
FORMAT(COUNT(...) ,0) - Oracle:
TO_CHAR(COUNT(...), '999,999')
简化方案(支持PIVOT语法的引擎可用)
如果你用的是Oracle、SQL Server、Spark SQL等支持PIVOT语法的引擎,可以用更简洁的写法:
SELECT * FROM ( SELECT a.Event_ID, b.Name, a.Customer_Id, Event_Execution_Date_ID FROM UNLIMITED.Event_Execution a JOIN UNLIMITED.Event_Master b ON a.Event_Id = b.ID WHERE Event_Execution_Date_ID IN ('20211006', '20211007') ) t PIVOT ( COUNT(Customer_Id) FOR Event_Execution_Date_ID IN ('20211006' AS `20211006`, '20211007' AS `20211007`) ) p ORDER BY `20211007` DESC;
如果后续需要新增其他日期的统计列,只需要在CASE WHEN的分支或者PIVOT的IN列表里追加对应日期的配置即可。如果需要自动适配所有日期生成动态列,需要结合存储过程/动态SQL实现。
内容的提问来源于stack exchange,提问作者Harish reddy
相关产品推荐
相关产品推荐

