之前我问了一个关于条件聚合的问题。 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,并且希望将来避免在此查询中添加更多行。
答案 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, '')