条件聚合引用 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, '')
我之前问过一个关于条件聚合的问题。
当时的解决方案是如下查询:
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, '')