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_id | campaign_id | message_date_time | call_date_time |
|---|---|---|---|
| R12 | T4 | 2018-02-03 | 2018-05-09 |
如果之后还有其他操作类型需要新增列,只需要复制一行MAX(CASE...)的代码,把action_type的值和列名改一下就行,扩展性很强。
内容的提问来源于stack exchange,提问作者Satria stuart
相关产品推荐
相关产品推荐

