条件聚合引用表而不是手动输入

时间:2016-06-29 20:20:08

标签: sql sql-server sql-server-2012 pivot

之前我问了一个关于条件聚合的问题。 SQL Transform Crosstab Pivot答案很棒!但是,我需要对此进行扩展。

当时的解决方案是以下查询:

SELECT
    Item,
    [X] = MAX(CASE WHEN [Columns] = 'X' THEN Result END),
    [Y] = MAX(CASE WHEN [Columns] = 'Y' THEN Result END),
    [Z] = MAX(CASE WHEN [Columns] = 'Z' THEN Result END)
FROM thisTable
GROUP BY Item

问题:我现在有一个表TEST,其中W,X,Y,Z为行。而不是向查询添加另一行([W] = MAX(CASE WHEN [Columns] = 'W' THEN Result END)),可以重写上面的查询以引用值的表吗?

原因是因为我预计不仅仅有W,X,Y,Z,并且希望将来避免在此查询中添加更多行。

1 个答案:

答案 0 :(得分:1)

如果您想继续使用条件聚合,可以像这样动态创建查询。

DECLARE @Columns NVARCHAR(MAX),
        @Sql NVARCHAR(MAX)

SELECT  @Columns = STUFF((
    SELECT  ',' + CONCAT(QUOTENAME([Columns]), ' = MAX(CASE WHEN [Columns] = ''', [Columns], ''' THEN Result END)')
    FROM    thisTable
    GROUP BY [Columns] -- distinct
    ORDER BY [Columns] -- order column names
    FOR XML PATH('')
), 1, 1, '')

SET @Sql = N'
    SELECT  Item,
            ' + @Columns + '
    FROM    thisTable
    GROUP BY Item
'
EXEC(@Sql)

如果您想使用TEST中的DESCRIPTION作为列名,可以使用它。

SELECT  @Columns = STUFF((
    SELECT  ',' + CONCAT(QUOTENAME([Description]), ' = MAX(CASE WHEN [Columns] = ''', [Columns], ''' THEN Result END)')
    FROM    TEST
    FOR XML PATH('')
), 1, 1, '')