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

MySQL Reporting表行转列查询:拆分action_type对应日期列

实现MySQL行转列:将不同操作类型的时间转为独立列

你要的是把同一用户、同一活动下不同操作类型的时间拆分成单独的列,这是个很常见的行转列场景,用条件聚合就能完美解决,这也是MySQL里处理这类需求的标准做法。

直接上可用的查询语句:

SELECT
    user_id,
    campaign_id,
    MAX(CASE WHEN action_type = 'message' THEN date_time END) AS message_date_time,
    MAX(CASE WHEN action_type = 'call' THEN date_time END) AS call_date_time
FROM Reporting
GROUP BY user_id, campaign_id;

给你拆解下这个语句的逻辑:

  • CASE WHEN会针对每一行判断action_type,如果是message就返回对应的date_time,否则返回NULL;同理处理call类型
  • 用MAX()聚合函数是为了把同一分组里的NULL值过滤掉,只留下有效的时间值——因为你的示例里每个(user_id, campaign_id)组合下每种操作类型只有一条数据,所以用MIN()也能得到同样的结果,选哪个都可以
  • GROUP BY user_id, campaign_id是核心,它会把相同用户和活动的行合并成一行,这样就能把两种操作的时间放在同一行展示

用你提供的示例数据测试这个查询,得到的结果正好是你想要的:

user_idcampaign_idmessage_date_timecall_date_time
R12T42018-02-032018-05-09

如果之后还有其他操作类型需要新增列,只需要复制一行MAX(CASE...)的代码,把action_type的值和列名改一下就行,扩展性很强。

内容的提问来源于stack exchange,提问作者Satria stuart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:09:37