【发布时间】:2013-03-15 00:53:18
【问题描述】:
您好,我是 SQL 透视的新手
我有不同的要求,我需要根据程序类别基于多列(Q1、Q2、Q3、Q4)透视数据。请告知我该如何实现这一目标?
所有示例均基于单个列(例如 SUM(Q1) FOR CategoryID IN ([People], [IT], [Travel])
我如何根据 Q1、Q2、Q3、Q4 调整它?
输入
输出
【问题讨论】:
标签: sql-server tsql pivot unpivot
您好,我是 SQL 透视的新手
我有不同的要求,我需要根据程序类别基于多列(Q1、Q2、Q3、Q4)透视数据。请告知我该如何实现这一目标?
所有示例均基于单个列(例如 SUM(Q1) FOR CategoryID IN ([People], [IT], [Travel])
我如何根据 Q1、Q2、Q3、Q4 调整它?
输入
输出
【问题讨论】:
标签: sql-server tsql pivot unpivot
为了获得您想要的结果,您必须同时应用 UNPIVOT 和 PIVOT 函数。
unpivot 函数会将您的 Q1、Q2、Q3 和 Q4 列转换为行。完成后,您将应用 pivot 函数。
unpivot 代码将与此类似:
select programid,
col + '_'+ category cat_col,
value
from yourtable
unpivot
(
value
for col in (Q1, Q2, Q3, Q4)
) unpiv
见SQL Fiddle with Demo。这给出了一个结果:
| PROGRAMID | CAT_COL | VALUE |
----------------------------------
| 366 | Q1_People | 109034 |
| 366 | Q2_People | 25418 |
| 366 | Q3_People | 101130 |
| 366 | Q4_People | 54787 |
您可以看到此查询创建了一个新的列名称来透视,其中包含类别值和季度名称。
获得此结果后,您可以应用数据透视函数:
select *
from
(
select programid,
col + '_'+ category cat_col,
value
from yourtable
unpivot
(
value
for col in (Q1, Q2, Q3, Q4)
) unpiv
) d
pivot
(
sum(value)
for cat_col in (Q1_People, Q2_People, Q3_People, Q4_People,
Q1_IT, Q2_IT, Q3_IT, Q4_IT,
Q1_Travel, Q2_Travel, Q3_Travel, Q4_Travel)
) piv
见SQL Fiddle with Demo。这给出了结果:
| PROGRAMID | Q1_PEOPLE | Q2_PEOPLE | Q3_PEOPLE | Q4_PEOPLE | Q1_IT | Q2_IT | Q3_IT | Q4_IT | Q1_TRAVEL | Q2_TRAVEL | Q3_TRAVEL | Q4_TRAVEL |
---------------------------------------------------------------------------------------------------------------------------------------------
| 366 | 109034 | 25418 | 101130 | 54787 | 0 | 0 | 0 | 0 | 1195 | 613 | 1113 | 1195 |
【讨论】: