基于列值的 Pivot Return null
Pivot Return null based on a column values
请考虑这个Table:
Id Year Month Type Value
------------------------------------------
1 2011 1 T1 1000
2 2012 1 T1 2000
3 2011 1 T2 5000
4 2012 1 T2 500
5 2011 1 T3 11000
6 2012 1 T3 800
我想创建这个结果:
Id Year Month T1 T2 T3
------------------------------------------------
1 2011 1 1000 5000 11000
2 2012 1 2000 500 800
我想根据它的值在 TYPE
列上使用 PIVOT
,我写了这个脚本:
SELECT [Year],[Month], [T1],[T2],[T3]
FROM (SELECT [Year],[Month],Value,[Type]
FROM MyTable
) p
PIVOT (MAX(VALUE) FOR [Type] IN ([[T1],[T2],[T3])) AS pvt
但此脚本生成 6 行,如下所示:
Id Year Month T1 T2 T3
------------------------------------------------
1 2011 1 1000 Null Null
2 2012 1 2000 Null Null
3 2011 1 Null 5000 Null
4 2012 1 Null 500 Null
5 2011 1 Null Null 11000
6 2012 1 Null Null 800
如何合并这个结果?
谢谢
你可以试试这个:
DECLARE @t TABLE
(
ID INT ,
Year INT ,
Month INT ,
Type CHAR(2) ,
Value INT
)
INSERT INTO @t
VALUES ( 1, 2011, 1, 'T1', 1000 ),
( 2, 2012, 1, 'T1', 2000 ),
( 3, 2011, 1, 'T2', 5000 ),
( 4, 2012, 1, 'T2', 500 ),
( 5, 2011, 1, 'T3', 11000 ),
( 6, 2012, 1, 'T3', 800 );
WITH cte
AS ( SELECT t1.Year ,
t1.Month ,
t1.Value AS T1 ,
t2.Value AS T2 ,
t3.Value AS T3 ,
ROW_NUMBER() OVER ( PARTITION BY t1.Year, t1.Month ORDER BY t1.ID, t2.ID, t3.ID ) AS rn ,
DENSE_RANK() OVER ( ORDER BY t1.ID ) AS ID
FROM @t t1
JOIN @t t2 ON t1.Type <> t2.Type
JOIN @t t3 ON t1.Type <> t3.Type AND t2.Type <> t3.Type
WHERE t1.Year = t2.Year
AND t1.Year = t3.Year
AND t1.Month = t2.Month
AND t1.Month = t2.Month
)
SELECT ID, Year, Month, T1, T2, T3
FROM cte
WHERE rn = 1
输出:
ID Year Month T1 T2 T3
1 2011 1 1000 5000 11000
2 2012 1 2000 500 800
但是你的代码也是一样的,因为Year
和Month
会通过消去排成行,Type
成为传播元素,Value
成为聚合元素。
我怀疑你的table表达式中有ID:
FROM (SELECT [Year],[Month],Value,[Type],[ID]
FROM MyTable
) p
在这种情况下,通过消除 !!!,分组元素变为 Year
、Month
和 ID
这就是为什么你得到所有 6 行的原因。
DECLARE @t TABLE
(
ID INT ,
Year INT ,
Month INT ,
Type CHAR(2) ,
Value INT
)
INSERT INTO @t
VALUES ( 1, 2011, 1, 'T1', 1000 ),
( 2, 2012, 1, 'T1', 2000 ),
( 3, 2011, 1, 'T2', 5000 ),
( 4, 2012, 1, 'T2', 500 ),
( 5, 2011, 1, 'T3', 11000 ),
( 6, 2012, 1, 'T3', 800 );
SELECT [Year],[Month], [T1],[T2],[T3]
FROM (SELECT [Year],[Month],Value,[Type]
FROM @t
) p
PIVOT (MAX(VALUE) FOR [Type] IN ([T1],[T2],[T3])) AS pvt
输出:
Year Month T1 T2 T3
2011 1 1000 5000 11000
2012 1 2000 500 800
请考虑这个Table:
Id Year Month Type Value
------------------------------------------
1 2011 1 T1 1000
2 2012 1 T1 2000
3 2011 1 T2 5000
4 2012 1 T2 500
5 2011 1 T3 11000
6 2012 1 T3 800
我想创建这个结果:
Id Year Month T1 T2 T3
------------------------------------------------
1 2011 1 1000 5000 11000
2 2012 1 2000 500 800
我想根据它的值在 TYPE
列上使用 PIVOT
,我写了这个脚本:
SELECT [Year],[Month], [T1],[T2],[T3]
FROM (SELECT [Year],[Month],Value,[Type]
FROM MyTable
) p
PIVOT (MAX(VALUE) FOR [Type] IN ([[T1],[T2],[T3])) AS pvt
但此脚本生成 6 行,如下所示:
Id Year Month T1 T2 T3
------------------------------------------------
1 2011 1 1000 Null Null
2 2012 1 2000 Null Null
3 2011 1 Null 5000 Null
4 2012 1 Null 500 Null
5 2011 1 Null Null 11000
6 2012 1 Null Null 800
如何合并这个结果?
谢谢
你可以试试这个:
DECLARE @t TABLE
(
ID INT ,
Year INT ,
Month INT ,
Type CHAR(2) ,
Value INT
)
INSERT INTO @t
VALUES ( 1, 2011, 1, 'T1', 1000 ),
( 2, 2012, 1, 'T1', 2000 ),
( 3, 2011, 1, 'T2', 5000 ),
( 4, 2012, 1, 'T2', 500 ),
( 5, 2011, 1, 'T3', 11000 ),
( 6, 2012, 1, 'T3', 800 );
WITH cte
AS ( SELECT t1.Year ,
t1.Month ,
t1.Value AS T1 ,
t2.Value AS T2 ,
t3.Value AS T3 ,
ROW_NUMBER() OVER ( PARTITION BY t1.Year, t1.Month ORDER BY t1.ID, t2.ID, t3.ID ) AS rn ,
DENSE_RANK() OVER ( ORDER BY t1.ID ) AS ID
FROM @t t1
JOIN @t t2 ON t1.Type <> t2.Type
JOIN @t t3 ON t1.Type <> t3.Type AND t2.Type <> t3.Type
WHERE t1.Year = t2.Year
AND t1.Year = t3.Year
AND t1.Month = t2.Month
AND t1.Month = t2.Month
)
SELECT ID, Year, Month, T1, T2, T3
FROM cte
WHERE rn = 1
输出:
ID Year Month T1 T2 T3
1 2011 1 1000 5000 11000
2 2012 1 2000 500 800
但是你的代码也是一样的,因为Year
和Month
会通过消去排成行,Type
成为传播元素,Value
成为聚合元素。
我怀疑你的table表达式中有ID:
FROM (SELECT [Year],[Month],Value,[Type],[ID]
FROM MyTable
) p
在这种情况下,通过消除 !!!,分组元素变为 Year
、Month
和 ID
这就是为什么你得到所有 6 行的原因。
DECLARE @t TABLE
(
ID INT ,
Year INT ,
Month INT ,
Type CHAR(2) ,
Value INT
)
INSERT INTO @t
VALUES ( 1, 2011, 1, 'T1', 1000 ),
( 2, 2012, 1, 'T1', 2000 ),
( 3, 2011, 1, 'T2', 5000 ),
( 4, 2012, 1, 'T2', 500 ),
( 5, 2011, 1, 'T3', 11000 ),
( 6, 2012, 1, 'T3', 800 );
SELECT [Year],[Month], [T1],[T2],[T3]
FROM (SELECT [Year],[Month],Value,[Type]
FROM @t
) p
PIVOT (MAX(VALUE) FOR [Type] IN ([T1],[T2],[T3])) AS pvt
输出:
Year Month T1 T2 T3
2011 1 1000 5000 11000
2012 1 2000 500 800