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

Conditional aggregation referencing table instead of manual entry

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

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

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

问题: 我现在有一个 table TEST 的行,其中包含 W、X、Y、Z。除了向查询添加另一行 ([W] = MAX(CASE WHEN [Columns] = 'W' THEN Result END)) 之外,是否可以重写上面的查询以引用 table 的值?

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

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

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, '')