MySQL中将列表值转为列:多列表状态及日期列转换问询
解决方案:MySQL行转列实现LIST字段分组
要实现将每个LIST转为独立列组的需求,你可以使用条件聚合(结合MAX()和CASE WHEN)完成行转列操作,具体SQL如下:
SELECT `email`, `isp_group`, -- list1对应字段组 MAX(CASE WHEN `LIST` = 'list1' THEN `STATUS` ELSE NULL END) AS LIST1_STATUS, MAX(CASE WHEN `LIST` = 'list1' THEN `SENT_DATE` ELSE NULL END) AS LIST1_SENT_DATE, MAX(CASE WHEN `LIST` = 'list1' THEN `CREATED_DATE` ELSE NULL END) AS LIST1_CREATED_DATE, -- list2对应字段组 MAX(CASE WHEN `LIST` = 'list2' THEN `STATUS` ELSE NULL END) AS LIST2_STATUS, MAX(CASE WHEN `LIST` = 'list2' THEN `SENT_DATE` ELSE NULL END) AS LIST2_SENT_DATE, MAX(CASE WHEN `LIST` = 'list2' THEN `CREATED_DATE` ELSE NULL END) AS LIST2_CREATED_DATE, -- list3对应字段组 MAX(CASE WHEN `LIST` = 'list3' THEN `STATUS` ELSE NULL END) AS LIST3_STATUS, MAX(CASE WHEN `LIST` = 'list3' THEN `SENT_DATE` ELSE NULL END) AS LIST3_SENT_DATE, MAX(CASE WHEN `LIST` = 'list3' THEN `CREATED_DATE` ELSE NULL END) AS LIST3_CREATED_DATE, -- 按此格式扩展至list15 MAX(CASE WHEN `LIST` = 'list4' THEN `STATUS` ELSE NULL END) AS LIST4_STATUS, MAX(CASE WHEN `LIST` = 'list4' THEN `SENT_DATE` ELSE NULL END) AS LIST4_SENT_DATE, MAX(CASE WHEN `LIST` = 'list4' THEN `CREATED_DATE` ELSE NULL END) AS LIST4_CREATED_DATE -- ... 重复结构直到list15 FROM `list_main` GROUP BY `email`, `isp_group` ORDER BY `email` DESC;
逻辑说明
CASE WHEN匹配当前行的LIST值,仅当LIST等于目标值时返回对应字段内容,否则返回NULLMAX()用于分组后提取唯一非NULL值(每个邮箱对应同一个LIST只会有一条记录,MAX不影响结果,仅用于聚合行)- 单个邮箱对应唯一ISP_GROUP,按
email+isp_group分组不会出现数据冲突
扩展到15个LIST
只需按照上述list1/list2的格式,重复编写对应三个CASE语句,将listX替换为实际LIST名称(list4至list15)即可,无对应LIST的字段会自动返回NULL。
内容的提问来源于stack exchange,提问作者John Beasley
相关产品推荐
相关产品推荐

