TSQL PIVOT有多个透视和不透视列?

时间:2013-10-31 12:45:46

标签: sql-server-2008 tsql pivot cross-apply

我有这个SAMPLE数据:

PERIOD FINANCE TYPE  SEGMENT  DEPARTMENT         PERIOD VALUE   ACCUMULATED VALUE
1       Actual       HE       Business           -9394.6         -9394.6
2       Actual       HE       Business           141646.6        132252
3       Actual       HE       Business           145920.25       278172.25
1       Actual       HE       Business Skills     0              0
2       Actual       HE       Business Skills     0              0
3       Actual       HE       Business Skills     0              0
1       Actual    SERVICES    Catering Services  32359.59        32359.59
2       Actual    SERVICES    Catering Services  147628.38       179987.97
3       Actual    SERVICES    Catering Services  174413.87       354401.84
1       Budget       HE       Business           139812.27       139812.27
2       Budget       HE       Business           139812.27       279624.54
3       Budget       HE       Business           139812.27       419436.81
1       Budget       HE       Business Skills     0              0
2       Budget       HE       Business Skills     0              0
3       Budget       HE       Business Skills     0              0
1       Budget    SERVICES    Catering Services  137500          137500
2       Budget    SERVICES    Catering Services  137500          275000
3       Budget    SERVICES    Catering Services  137500          412500

我需要这种格式:

FINANCE TYPE  SEGMENT   DEPARTMENT          PERIOD VALUE 1  PERIOD VALUE 2  PERIOD VALUE 3  ACCUMULATED VALUE 1 ACCUMULATED VALUE 2 ACCUMULATED VALUE 3
Actual         HE       Business            -9394.6         141646.6        145920.25             -9394.6              132252           278172.25
Actual         HE       Business Skills     0               0               0   0   0   0
Actual       SERVICES   Catering Services   32359.59        147628.38       174413.87   32359.59    179987.97   354401.84
Budget         HE       Business            139812.27       139812.27       139812.27   139812.27   279624.54   419436.81
Budget         HE       Business Skills     0               0               0   0   0   0
Budget       SERVICES   Catering Services   137500          137500          137500  137500  275000  412500

我已经尝试了以下代码,但是在不存在的情况下获得了几个NULL值,输出只是错误的。我仍然试图理解交叉应用和枢轴的使用。

SELECT [FINANCE TYPE], SEGMENT, 
  DEPARTMENT, [PERIOD VALUE1], 
  [PERIOD VALUE2], [PERIOD VALUE3], 
  [PERIOD VALUE4], [PERIOD VALUE5], 
  [PERIOD VALUE6], [PERIOD VALUE7], 
  [PERIOD VALUE8], [PERIOD VALUE9], 
  [PERIOD VALUE10], [PERIOD VALUE11], 
  [PERIOD VALUE12], [ACCUMULATED VALUE1], 
  [ACCUMULATED VALUE2], [ACCUMULATED VALUE3], 
  [ACCUMULATED VALUE4], [ACCUMULATED VALUE5], 
  [ACCUMULATED VALUE6], [ACCUMULATED VALUE7], 
  [ACCUMULATED VALUE8], [ACCUMULATED VALUE9], 
  [ACCUMULATED VALUE10], [ACCUMULATED VALUE11], 
  [ACCUMULATED VALUE12] 
FROM 
( 
    SELECT PERIOD, [FINANCE TYPE], 
      SEGMENT, DEPARTMENT, 
      COL, VALUE, COL+PERIOD AS PRD 
    FROM CTE 
    CROSS APPLY 
    ( 
        SELECT 'PERIOD VALUE', [PERIOD VALUE] UNION ALL 
        SELECT 'ACCUMULATED VALUE', [ACCUMULATED VALUE] 
    )C(COL, VALUE) 
)D 
PIVOT 
( 
  MAX(VALUE) 
  FOR [PRD] IN ([PERIOD VALUE1], [PERIOD VALUE2], [PERIOD VALUE3], 
                [PERIOD VALUE4], [PERIOD VALUE5], [PERIOD VALUE6] , 
                [PERIOD VALUE7], [PERIOD VALUE8], [PERIOD VALUE9], 
                [PERIOD VALUE10], [PERIOD VALUE11], [PERIOD VALUE12] , 
                [ACCUMULATED VALUE1], [ACCUMULATED VALUE2], 
                [ACCUMULATED VALUE3], [ACCUMULATED VALUE4], 
                [ACCUMULATED VALUE5], [ACCUMULATED VALUE6] , 
                [ACCUMULATED VALUE7], [ACCUMULATED VALUE8], 
                [ACCUMULATED VALUE9], [ACCUMULATED VALUE10], 
                [ACCUMULATED VALUE11], [ACCUMULATED VALUE12]) 
)PIV

非常感谢帮助我解决这个问题的任何帮助。

1 个答案:

答案 0 :(得分:1)

我发现现有代码存在一些问题。首先,在您的子查询中,您重复了colPeriod - 一旦用于创建具有Period的新列名称,并且一次自己创建。这会改变您的结果,因为colPeriod本身会被分组,因此如果您不在最终结果中使用它,请不要将其包含在子查询中。

代码应更改为以下内容:

SELECT [FINANCE TYPE], SEGMENT, 
  DEPARTMENT, [PERIOD VALUE1], 
  [PERIOD VALUE2], [PERIOD VALUE3], 
  [PERIOD VALUE4], [PERIOD VALUE5], 
  [PERIOD VALUE6], [PERIOD VALUE7], 
  [PERIOD VALUE8], [PERIOD VALUE9], 
  [PERIOD VALUE10], [PERIOD VALUE11], 
  [PERIOD VALUE12], [ACCUMULATED VALUE1], 
  [ACCUMULATED VALUE2], [ACCUMULATED VALUE3], 
  [ACCUMULATED VALUE4], [ACCUMULATED VALUE5], 
  [ACCUMULATED VALUE6], [ACCUMULATED VALUE7], 
  [ACCUMULATED VALUE8], [ACCUMULATED VALUE9], 
  [ACCUMULATED VALUE10], [ACCUMULATED VALUE11], 
  [ACCUMULATED VALUE12] 
FROM 
( 
    SELECT [FINANCE TYPE], 
      SEGMENT, DEPARTMENT, 
      VALUE, 
      COL+cast(PERIOD as varchar(10)) AS PRD 
    FROM yourtable 
    CROSS APPLY 
    ( 
        SELECT 'PERIOD VALUE', [PERIOD VALUE] UNION ALL 
        SELECT 'ACCUMULATED VALUE', [ACCUMULATED VALUE] 
    )C(COL, VALUE) 
)D 
PIVOT 
( 
  MAX(VALUE) 
  FOR [PRD] IN ([PERIOD VALUE1], [PERIOD VALUE2], [PERIOD VALUE3], 
                [PERIOD VALUE4], [PERIOD VALUE5], [PERIOD VALUE6] , 
                [PERIOD VALUE7], [PERIOD VALUE8], [PERIOD VALUE9], 
                [PERIOD VALUE10], [PERIOD VALUE11], [PERIOD VALUE12] , 
                [ACCUMULATED VALUE1], [ACCUMULATED VALUE2], 
                [ACCUMULATED VALUE3], [ACCUMULATED VALUE4], 
                [ACCUMULATED VALUE5], [ACCUMULATED VALUE6] , 
                [ACCUMULATED VALUE7], [ACCUMULATED VALUE8], 
                [ACCUMULATED VALUE9], [ACCUMULATED VALUE10], 
                [ACCUMULATED VALUE11], [ACCUMULATED VALUE12]) 
)PIV

请参阅SQL Fiddle with Demo