SQL Pivot基于多个列

时间:2013-03-25 13:46:48

标签: sql-server tsql pivot unpivot

您好我是SQL Pivoting的新手

我有不同的要求,我需要根据程序类别基于多个列(Q1,Q2,Q3,Q4)进行数据透视。请告知我如何实现这一目标?

所有示例都基于单个列(例如,SUM(Q1)FOR CategoryID IN([People],[IT],[Travel])

如何根据Q1,Q2,Q3,Q4进行调整?

输入

Input

输出

Result

1 个答案:

答案 0 :(得分:2)

为了获得您想要的结果,您必须同时应用UNPIVOTPIVOT函数。

unpivot 功能会将您的Q1Q2Q3Q4列转换为行。完成后,您将应用 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 |

您可以看到此查询为pivot创建了一个新列名,其中包含类别值和季度名称。

获得此结果后,您可以应用数据透视功能:

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 |