SQL多列Pivot需求:在现有Pivot中新增Date_input列
问题描述
我有如下的Mytable表:
| TT | ID | No | Date_input | BR |
|---|---|---|---|---|
| 1 | 06041098 | 780000 | 01/01/2015 | 111 |
| 2 | 01506000299 | 780000 | 11/07/2022 | 111 |
| 1 | 06048903 | 783111 | 01/01/2015 | 123 |
| 2 | 015173000562 | 783111 | 04/25/2023 | 123 |
| 1 | 01517300 | 792523 | 02/02/2022 | 150 |
| 2 | 011105981 | 792523 | 03/21/2022 | 150 |
| 3 | 0346166413164 | 792523 | 04/25/2023 | 150 |
我当前用以下SQL实现ID列的透视:
select no, br, [1] as ID1, [2] as ID2, [3] as ID3 from (select TT, id, no, Br from Mytable) Table_Pivot pivot (min(ID) for TT in ([1] , [2] , [3])) bang
现在需要修改该语句,在透视结果中同时加入Date_input列,得到如下格式的结果:
| NoB | Br | ID1 | Date_input1 | ID2 | Date_input2 | ID3 | Date_input3 |
|---|---|---|---|---|---|---|---|
| 780000 | 111 | 06041098 | 01/01/2015 | 01506000299 | 11/07/2022 | ||
| 783111 | 123 | 06048903 | 01/01/2015 | 015173000562 | 04/25/2023 | ||
| 792523 | 150 | 01517300 | 02/02/2022 | 011105981 | 03/21/2022 | 0346166413164 | 04/25/2023 |
解决方案
方法一:CASE表达式+GROUP BY(推荐)
通过CASE表达式分别匹配不同TT值,提取对应ID和日期,再按No和Br分组聚合,逻辑直观且性能更优:
SELECT no AS NoB, br, MAX(CASE WHEN TT = 1 THEN ID END) AS ID1, MAX(CASE WHEN TT = 1 THEN Date_input END) AS Date_input1, MAX(CASE WHEN TT = 2 THEN ID END) AS ID2, MAX(CASE WHEN TT = 2 THEN Date_input END) AS Date_input2, MAX(CASE WHEN TT = 3 THEN ID END) AS ID3, MAX(CASE WHEN TT = 3 THEN Date_input END) AS Date_input3 FROM Mytable GROUP BY no, br ORDER BY no;
方法二:多次透视后关联
先分别对ID和Date_input做透视,再通过No字段关联结果:
WITH PivotID AS ( SELECT no, br, [1] as ID1, [2] as ID2, [3] as ID3 FROM (SELECT TT, id, no, Br FROM Mytable) Table_Pivot PIVOT (MIN(ID) FOR TT IN ([1], [2], [3])) AS PivotID ), PivotDate AS ( SELECT no, [1] as Date_input1, [2] as Date_input2, [3] as Date_input3 FROM (SELECT TT, Date_input, no FROM Mytable) Table_Pivot PIVOT (MIN(Date_input) FOR TT IN ([1], [2], [3])) AS PivotDate ) SELECT p1.no AS NoB, p1.br, p1.ID1, p2.Date_input1, p1.ID2, p2.Date_input2, p1.ID3, p2.Date_input3 FROM PivotID p1 JOIN PivotDate p2 ON p1.no = p2.no ORDER BY p1.no;
两种方法都能得到目标结果,方法一无需子查询和关联,更简洁高效。
内容的提问来源于stack exchange,提问作者Lucio
相关产品推荐
相关产品推荐

