T-SQL合并构造动态sqlselect语句

T-SQL Coalesce to contstruct a dynamic sql select statement

DECLARE @sumh VARCHAR(MAX)
DECLARE @sql VARCHAR(MAX)

SELECT 
    @sumh = COALESCE(@sumh+Name+']) AS ['+Name+'],SUM([' ,'') 
FROM
    Hals

SELECT 
    @sumh = 'SUM(['+@sumh+ ']) AS Sum'

SET @sql = '

SELECT 
    Category = ISNULL(CATEGORY,''Total''),CatID,'+@sumh+' 
FROM
    (--My Pivot Query Here
    ) AS P 
GROUP BY GROUPING SETS ((CATEGORY,CatID),())'

PRINT (@sql)

正在生产

SELECT 
    Category = ISNULL(CATEGORY,'Total'),CatID,SUM([Bc-Def]) AS [Bc-Def],SUM([Cd-Def]) AS [Cd-Def],SUM([De-Efg]) AS [De-Efg],SUM([Ef-Fgh]) AS [Ef-Fgh],SUM([Fg-Ghi]) AS [Fg-Ghi],SUM([]) AS Sum  FROM
(--My Pivot Query Here
) AS P 
GROUP BY GROUPING SETS ((CATEGORY,CatID),())

我有两个您可能已经注意到的问题。来自 table 'Hals' 的第一行 ('Name') 被 Coalesce 忽略 而且,我可以通过任何方式摆脱最后的 "SUM([]) AS Sum"

为了清楚起见,我希望它return如下

SELECT Category=ISNULL(CATEGORY,'Total'),CatID,SUM([Ab-Bcd]) AS [Ab-Bcd],SUM([Bc-Def]) AS [Bc-Def],SUM([Cd-Def]) AS [Cd-Def],SUM([De-Efg]) AS [De-Efg],SUM([Ef-Fgh]) AS [Ef-Fgh],SUM([Fg-Ghi]) AS [Fg-Ghi]  FROM
(--My Pivot Query Here
) AS P 
GROUP BY GROUPING SETS ((CATEGORY,CatID),())

我这里有个sqlfiddle说清楚http://sqlfiddle.com/#!3/c7d29/3 我对替代解决方案持开放态度。 (列类别和类别 ID 是 return 从我的数据透视查询中编辑的,并且在我手动传递测试列名称时测试工作正常。我只需要帮助来构建动态 select。

谢谢

你可以这样做:

DECLARE @sumh VARCHAR(MAX)
DECLARE @sql VARCHAR(MAX)
SET @SumH = ''
SELECT @sumh = COALESCE(@sumh+' SUM([' + Name+']) AS ['+Name+'] ', ' -- SHOULD NEVER OCCUR -- ') 
FROM Hals

SET @sql = '
SELECT Category=ISNULL(CATEGORY,''Total''),CatID '+@sumh+' FROM
(
--My Pivot Query Here
) AS P 
GROUP BY GROUPING SETS ((CATEGORY,CatID),())
'
select @sql

当@SumH 永远不会为 null 时,它将采用 COEALESCE 中的第一个参数,这样您就可以使代码更符合您的意图,至少我是这样理解的。