如何在SQL/DB2中使用pivot实现两表关联后按用户月份行转列?
DB2/SQL行转列实现方案
实现逻辑:
- 关联用户表和访问记录表,提取访问月份并按要求格式化
- 用窗口函数为同一用户、同一访问月份下的商品按访问顺序生成1-4的序号
- 通过条件聚合完成行转列,不足4个的位置自动留空,超过4个的商品默认忽略
SELECT t.Userid, t.Username, t.month, MAX(CASE WHEN t.rn = 1 THEN t.item END) AS item1, MAX(CASE WHEN t.rn = 2 THEN t.item END) AS item2, MAX(CASE WHEN t.rn = 3 THEN t.item END) AS item3, MAX(CASE WHEN t.rn = 4 THEN t.item END) AS item4 FROM ( SELECT a.Userid, a.Username, -- DB2环境下格式化月份为 "October 21" 格式 TRIM(TO_CHAR(b.Date_visit, 'Month')) || ' ' || TO_CHAR(b.Date_visit, 'YY') AS month, b.item, -- 同用户同月份内按访问时间排序生成序号,排序规则可按需调整 ROW_NUMBER() OVER( PARTITION BY a.Userid, TO_CHAR(b.Date_visit, 'YYYYMM') ORDER BY b.Date_visit, b.item ) AS rn FROM 表1 a INNER JOIN 表2 b ON a.Userid = b.Userid ) t WHERE t.rn <= 4 GROUP BY t.Userid, t.Username, t.month ORDER BY t.Userid, t.month
补充说明:如果需要兼容其他SQL环境,仅调整月份格式化函数即可,比如MySQL替换为DATE_FORMAT(Date_visit, '%M %y'),Oracle的TO_CHAR规则和DB2基本一致。如需展示更多商品列,新增对应序号的CASE WHEN判断即可。
内容的提问来源于stack exchange,提问作者Butterfly
相关产品推荐
相关产品推荐

