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