【问题标题】:Multi-Column, Multi-Row PIVOT多列、多行 PIVOT
【发布时间】:2014-01-31 16:35:42
【问题描述】:

假设我有一个表格,其中包含以下形式的数据:

Foo_FK  MonthCode_FK  Activity_FK  SumResultsX  SumResultsY
-----------------------------------------------------------
1       201312        0            10           2
1       201312        1            5            1
1       201401        0            15           3
1       201401        1            7            2
2       201312        0            9            3
2       201312        1            1            2
2       201401        0            6            2
2       201401        1            17           4

出于我的目的,可以安全地假设此表是由 Foo_FK, MonthCode_FK, Activity_FK 上的 GROUP BYSUM( ResultsA ), SUM( ResultsB ) 创建的聚合以获取数据,从而使 Foo_FK, MonthCode_FK, Activity_FK 每条记录唯一。

如果出于某种原因,我发现在存储过程中比 PIVOT 这个表更可取,以减轻我必须做的 SSRS 操作量(无疑是以后维护),希望获得以下格式通过矩阵 tablix 消费:

Foo_FK  1312_0_X  1312_0_Y  1312_1_X  1312_1_Y  1401_0_X  1401_0_Y  1401_1_X  1401_1_Y  
--------------------------------------------------------------------------------------
1       10        2         5         1         15        3         7         2
2       9         3         1         2         6         2         17        4

我将如何以一种非精神的方式来做这件事?请参阅此SQL Fiddle 以证明我可能会尝试使用锤子来构建一个推入钉子的设备。不用担心动态版本,因为我确信一旦指导我完成此测试用例的静态解决方案,我就能弄清楚。

现在,我尝试通过以下方式创建一个Foo_FK, MonthCode_FK 集,然后我尝试将其设置为PIVOTsee the Fiddle for the full mess):

SELECT  Foo_FK = ISNULL( a0.Foo_FK, a1.Foo_FK ),
        MonthCode_FK = ISNULL( a0.MonthCode_FK, a1.MonthCode_FK ),
        [0_X] = ISNULL( a0.SumResultX, 0 ),
        [0_Y] = ISNULL( a0.SumResultY, 0 ),
        [1_X] = ISNULL( a1.SumResultX, 0 ),
        [1_Y] = ISNULL( a1.SumResultY, 0 )
FROM (  SELECT  Foo_FK, MonthCode_FK, Activity_FK, 
                SumResultX, SumResultY
        FROM    dbo.t_FooActivityByMonth
        WHERE   Activity_FK = 0 ) a0
FULL OUTER JOIN (
        SELECT  Foo_FK, MonthCode_FK, Activity_FK, 
                SumResultX, SumResultY
        FROM    dbo.t_FooActivityByMonth
        WHERE   Activity_FK = 1 ) a1
    ON  a0.Foo_FK = a1.Foo_FK;

我遇到了一些excellent advice on this SO question,所以我正在使用PIVOTMAX 扭转一切之前执行某种形式的UNPIVOT,但如果有更好的方法这个,我听好了。

【问题讨论】:

    标签: sql-server-2008-r2 pivot unpivot


    【解决方案1】:

    看来您应该能够通过首先将 unpivot 应用于您的 SumResultXSumResultY 列,然后旋转数据来做到这一点:

    ;with cte as
    (
      select Foo_FK, 
        col = cast(MonthCode_FK as varchar(6))+'_'
                +cast(activity_fk as varchar(1))+'_'+sumresult, 
        value
      from dbo.t_FooActivityByMonth
      cross apply
      (
        values 
          ('X', SumResultX),
          ('Y', SumResultY)
      ) c (sumresult, value)
    ) 
    select Foo_FK, 
      [201312_0_X], [201312_0_Y], [201312_1_X], [201312_1_Y],
      [201401_0_X], [201401_0_Y], [201401_1_X], [201401_1_Y]
    from cte
    pivot
    (
      max(value)
      for col in ([201312_0_X], [201312_0_Y], [201312_1_X], [201312_1_Y],
                  [201401_0_X], [201401_0_Y], [201401_1_X], [201401_1_Y])
    ) piv;
    

    SQL Fiddle with Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      相关资源
      最近更新 更多