我在存储过程中有一个名为grouplist的参数。 它包含逗号分隔值的列名。
例如: @grouplist =' Class1,Class2,Class3'
我的查询是
设置@ Sql ='选择' + @grouplist +'来自#final
我的结果是
这些列包含值" ZZTotal"值。它应该替换为" Total"这些是动态专栏。
我需要将zztotal替换为total。
在最终输出中它应该是这样的
任何帮助表示赞赏
答案 0 :(得分:2)
有一个更大的问题被忽略:很可能是文本已经ZZTotal
而不是Total
的原因。而这个原因最有可能是为了维持正确的行排序(即将总数保持在底部)。
ZZTotal
行很可能是由SQL Server通过GROUP BY子句的ROLLUP
选项自动生成的。最初,ROLLUP
选项将NULL
放在正在汇总的每个“组”中,因为字符串“Total”(或任何字符串)将不适合非字符串数据类型的列。在将结果转储到NULL
时,我猜测ZZTotal
值已被ISNULL()
替换为#final
。
当前的问题是,如果您将ZZTotal
值替换为Total
,那么“总计”行可能不会位于该分组的底部,至少不会包含任何包含的分组以U...
或Tp...
或Tou...
开头的字符串,依此类推。
第一步是在#final
表格中添加IDENTITY列。您可以通过添加#final
作为IDENTITY(INT, 1, 1) AS [RowNum],
语句的第一列来更改创建和填充SELECT
的查询。
第二步是将填充ISNULL(column, 'ZZTotal')
的查询的#final
更改为(例如,对于Class2):
IIF(GROUPING(class2) = 0, class2, N'Total for ' + class1) AS [Class2]
请注意N'Total for ' + class1
末尾使用“class1”而非“class2”。
第三步/最后一步是将ORDER BY [RowNum]
添加到Set @Sql=
语句的末尾。最终的查询应该是这样的:
SELECT Class1, Class2, Class3 FROM #final ORDER BY [RowNum];
示例1:ROLLUP默认行为
SELECT ss.[name] AS [SchemaName],
so.[type_desc] AS [ObjectType],
COUNT(*) AS [ObjectCount]
FROM [master].sys.schemas ss
INNER JOIN [master].sys.objects so
ON so.[schema_id] = ss.[schema_id]
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP;
示例2:在GROUPING行中替换为NULL的ROLLUP
SELECT IIF(GROUPING(ss.[name]) = 0, ss.[name], N'Total') AS [SchemaName],
IIF(GROUPING(so.[type_desc]) = 0,
so.[type_desc],
IIF(GROUPING(ss.[name]) = 0,
N'Total for ' COLLATE Latin1_General_CI_AS_KS_WS + ss.[name],
N'---------------------------------------->')
) AS [ObjectType],
COUNT(*) AS [ObjectCount]
FROM [master].sys.schemas ss
INNER JOIN [master].sys.objects so
ON so.[schema_id] = ss.[schema_id]
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP;
示例3:将IDENTITY列和INTO子句添加到示例#2
SELECT IIF(GROUPING(ss.[name]) = 0, ss.[name], N'Total') AS [SchemaName],
IIF(GROUPING(so.[type_desc]) = 0,
so.[type_desc],
IIF(GROUPING(ss.[name]) = 0,
N'Total for ' COLLATE Latin1_General_CI_AS_KS_WS + ss.[name],
N'---------------------------------------->')
) AS [ObjectType],
COUNT(*) AS [ObjectCount],
IDENTITY(INT, 1, 1) AS [RowNum]
INTO #TempResults
FROM [master].sys.schemas ss
INNER JOIN [master].sys.objects so
ON so.[schema_id] = ss.[schema_id]
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP;
SELECT * FROM #TempResults ORDER BY [RowNum];