【问题标题】:SQL Pivot based on multiple columns基于多列的 SQL Pivot
【发布时间】: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


    【解决方案1】:

    为了获得您想要的结果,您必须同时应用 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 |
    

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

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

    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 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 2021-12-02
      • 2021-02-03
      • 2020-07-02
      • 1970-01-01
      相关资源
      最近更新 更多