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

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等于目标值时返回对应字段内容,否则返回NULL
  • MAX() 用于分组后提取唯一非NULL值(每个邮箱对应同一个LIST只会有一条记录,MAX不影响结果,仅用于聚合行)
  • 单个邮箱对应唯一ISP_GROUP,按email+isp_group分组不会出现数据冲突

扩展到15个LIST

只需按照上述list1/list2的格式,重复编写对应三个CASE语句,将listX替换为实际LIST名称(list4至list15)即可,无对应LIST的字段会自动返回NULL。

内容的提问来源于stack exchange,提问作者John Beasley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:13:27