SQL查询对多列进行反透视和联合
Posted
技术标签:
【中文标题】SQL查询对多列进行反透视和联合【英文标题】:SQL query to unpivot and union for multiple column 【发布时间】:2021-01-08 14:55:09 【问题描述】:我正在努力实现以下结果...
输入,表 A
-----+--------+--------+-----+-------+----------+----------+---------+
sub | c_f | type | F_G | layer | dec_2020 | jan_2021 | feb_2021
-----+--------+--------+-----+-------+----------+----------+---------+
A600 | Core | Analog | F | 50 | d_val_1 | j_val_1 | f_val_1
A600 | Core | Analog | F | 60 | d_val_2 | j_val_2 | f_val_2
A600 | future| Analog | G | 32 | d_val_3 | j_val_3 | f_val_3
-----+--------+--------+-----+-------+----------+----------+---------+
我会得到这个输出
-----------+-----+--------+--------+-----+-------+----------+
month_year | sub | c_f | type | F_G | layer | values
-----------+-----+--------+--------+-----+-------+----------+
dec_2020 |A600 | Core | Analog | F | 50 | d_val_1
dec_2020 |A600 | Core | Analog | F | 60 | d_val_2
dec_2020 |A600 | future| Analog | G | 32 | d_val_3
jan_2021 |A600 | Core | Analog | F | 50 | j_val_1
jan_2021 |A600 | Core | Analog | F | 60 | j_val_2
jan_2021 |A600 | future| Analog | G | 32 | j_val_3
feb_2021 |A600 | Core | Analog | F | 50 | f_val_1
feb_2021 |A600 | Core | Analog | F | 60 | f_val_2
feb_2021 |A600 | future| Analog | G | 32 | f_val_3
-----+--------+--------+-----+-------+----------+----------+
我正在尝试使用交叉应用,我可以创建列“month_year”,但我不知道如何合并最后一列中的“值”。 感谢您的帮助!
【问题讨论】:
【参考方案1】:我认为这基本上是apply
:
select v.month_year, a.sub, a.c_f, a.type, a.F_G, a.layer, v.value
from a cross apply
(values ('dec_2020', a.dec_2020),
('jan_2021', a.jan_2021),
('feb_2021', a.feb_2021)
) v(month_year, value);
【讨论】:
【参考方案2】:使用UNPIVOT
:
SELECT month_year, sub, [c_f], [type], [F_G], layer, [val]
FROM
(SELECT *
FROM t) p
UNPIVOT
(val FOR month_year IN
([dec_2020], [jan_2021], [feb_2021])
)AS unpvt;
Demo here
【讨论】:
以上是关于SQL查询对多列进行反透视和联合的主要内容,如果未能解决你的问题,请参考以下文章