2011-10-11 17 views
2

我有以下形式的CTE表达式:如何将行转换为CTE产生的列?

ID Name Badge Type Value 
1 John Blue Pre 10 
1 John Blue Post 20 
1 John Blue Cur 30 
1 John Green Pre 50 
1 John Green Post 30 
1 John Green Cur 20 

我试图让下面的形式的结果:

WITH nCTE AS 
(
    SELECT * 
    FROM 
    TableA X INNER JOIN TableB Y 
    ON X.ID = Y.ID 
) 
SELECT * 
FROM 
(
    SELECT ... 
    FROM nCTE 
) 
WHERE ... 
GROUP BY ... 
ORDER BY ... 

的这个查询看起来像这样的结果

ID Name Badge Pre Cur Post 
1 John Blue 10 20 30 
2 John Green 50 30 20 

因为我正在使用CTE,我不确定我是否可以直接做到这一点,或者我应该多次自我加入结果以获得此结果(这只会使一切都看起来很漫长,丑陋和复杂)。有没有一个很好的方法来实现这一目标?

UPDATE:尝试这个返回NULL值

WITH nCTE AS 
(
    SELECT * 
    FROM 
    TableA X INNER JOIN TableB Y 
    ON X.ID = Y.ID 
) 
SELECT ID, Name, Badge, [0] AS 'Pre', [1] AS 'Cur', [2] AS 'Post' 
FROM 
(
    SELECT * 
    FROM 
    (
     SELECT ... 
     FROM nCTE 
    ) 
    WHERE ... 
    GROUP BY ... 
) Y 
PIVOT 
(
    MAX(Value) 
    FOR Type IN ([0], [1], [2]) 
) AS PivotTable 
ORDER BY ... 

尽管查询本身的工作原理,它返回如下:

ID Name Badge Pre  Cur  Post 
1 John Blue NULL NULL NULL 
2 John Green NULL NULL NULL 

任何建议,为什么发生这种情况?

+0

lookup PIVOT ... –

+0

@Mitch小麦:谢谢。我正在看它,但是我不太了解如何将它与CTE结合使用。我正在尝试它。如果我设法找到解决方案,将删除此问题。 – Legend

+0

@MitchWheat:发表我的做法。虽然它返回预期的格式,但是,结果包含NULL值,我不确定为什么会发生这种情况。你有什么建议吗? – Legend

回答

1

我的坏!转轴需要实际值。我一直在盲从MSDN的例子。在任何情况下,以下工作:

WITH nCTE AS 
(
    SELECT * 
    FROM 
    TableA X INNER JOIN TableB Y 
    ON X.ID = Y.ID 
) 
SELECT ID, Name, Badge, [Pre] AS 'Pre', [Cur] AS 'Cur', [Post] AS 'Post' 
FROM 
(
    SELECT * 
    FROM 
    (
     SELECT ... 
     FROM nCTE 
    ) 
    WHERE ... 
    GROUP BY ... 
) Y 
PIVOT 
(
    MAX(Value) 
    FOR Type IN ([Pre], [Cur], [Post]) 
) AS PivotTable 
ORDER BY ... 
+0

您可能不需要GROUP BY结果中的'PIVOT' /'MAX'。你可以直接使用'PIVOT' /'SUM'(或者你在GROUP BY中使用的任何聚合)。 –