2015-02-10 105 views
0

请考虑此表:枢轴返回null基于列值

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 

我该如何合并这个结果?

感谢

回答

2

你可以试试这个:

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 

但你的代码不一样的,因为YearMonth将在行消除,Type变传播元素和Value是聚合元素。

我怀疑你在你的表表达式具有ID:

FROM (SELECT [Year],[Month],Value,[Type],[ID] 
     FROM MyTable 
    ) p 

在这种情况下,分组元素通过消除变得YearMonthID! 这就是为什么你得到所有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