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 中的第一个参数,这样您就可以使代码更符合您的意图,至少我是这样理解的。
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 中的第一个参数,这样您就可以使代码更符合您的意图,至少我是这样理解的。