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查询对多列进行反透视和联合的主要内容,如果未能解决你的问题,请参考以下文章

转置列或反透视 SQL 查询

SQL多表多字段联合查询怎么弄?最终结果用HTML页面以表格形式显示(表格已有,类似excel)。

如何对sql查询引用组中的多列求和

反透视具有多列的数据 - 请语法帮助

SQL 透视/反透视?

SQL Unpivot 多列数据