Sql server 2008 具有多个数据透视和未数据透视列的TSQL数据透视?

Sql server 2008 具有多个数据透视和未数据透视列的TSQL数据透视?,sql-server-2008,tsql,pivot,cross-apply,Sql Server 2008,Tsql,Pivot,Cross Apply,我有以下样本数据: 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 Actua

我有以下样本数据:

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

如果您能帮助我解决这个问题,我们将不胜感激。

我发现您现有的代码有一些地方有问题。首先,在子查询中,您重复了
期间
——在使用它创建带有
期间
的新列名时,以及在它自己创建列名时。这将改变您的结果,因为
期间
本身将按分组,因此如果在最终结果中不使用它,请不要将其包含在子查询中

应将代码更改为以下内容:

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

请参见

我发现您现有的代码存在一些问题。首先,在子查询中,您重复了
期间
——在使用它创建带有
期间
的新列名时,以及在它自己创建列名时。这将改变您的结果,因为
期间
本身将按分组,因此如果在最终结果中不使用它,请不要将其包含在子查询中

应将代码更改为以下内容:

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

请参见

谢谢您的帮助……为什么会有空值?有周期1,2,3和累计1,2,3的值,为什么它们显示在单独的行上,而不是全部显示在一行上。这就是我作为我的朋友所希望的output@Chen看到我的编辑,我错过了你也必须从子查询中删除
句点
-你应该有正确的结果现在看到这个演示-非常好的帮助!非常感谢xThanks…为什么会有空值?有周期1,2,3和累计1,2,3的值,为什么它们显示在单独的行上,而不是全部显示在一行上。这就是我作为我的朋友所希望的output@Chen看到我的编辑,我错过了你也必须从子查询中删除
句点
-你应该有正确的结果现在看到这个演示-非常好的帮助!非常感谢x