我在名为grouplist的存储过程中有一个参数。 这包含逗号分隔值中的列名称。Sql字符串替换问题
为如:@ GROUPLIST = '的Class1,Class2中,Class3的'
我的查询是
集@的Sql = '选择' + @grouplist从#final
+”我结果是
这些列中包含值 “ZZTotal” 值。它应该被替换为“总计”。这些是动态栏。
我需要用总数替换zztotal。
在最后的输出应该是这样的
任何帮助表示赞赏
我在名为grouplist的存储过程中有一个参数。 这包含逗号分隔值中的列名称。Sql字符串替换问题
为如:@ GROUPLIST = '的Class1,Class2中,Class3的'
我的查询是
集@的Sql = '选择' + @grouplist从#final
+”我结果是
这些列中包含值 “ZZTotal” 值。它应该被替换为“总计”。这些是动态栏。
我需要用总数替换zztotal。
在最后的输出应该是这样的
任何帮助表示赞赏
有是被忽略一个更大的问题:有是最有可能的一个原因,文本已经ZZTotal
而不是Total
。而这个原因很可能是为了保持正确的排序(即保持总数在最低)。
ZZTotal
行很可能是由SQL Server通过GROUP BY子句的ROLLUP
选项自动生成的。最初,ROLLUP
选项将NULL
置于每个正在汇总的“组”中,因为字符串“Total”(或任何字符串)不适合一列非字符串数据类型。我猜测当将结果转储到#final
时,NULL
值被替换为ZZTotal
通过ISNULL()
。
目前的问题是,如果你与Total
更换ZZTotal
值,则“总计”行会可能不会在该分组的底部,至少不是包含字符串的开头U...
,或Tp...
任何分组,或Tou...
,等等。
的第一步是将IDENTITY列添加到#final
表。您可以通过更改创建并填充#final
的查询来添加IDENTITY(INT, 1, 1) AS [RowNum],
作为SELECT
语句的第一列。
第二步是改变这种填充#final
,而不是成为查询(等级2,例如)的ISNULL(column, 'ZZTotal')
:
IIF(GROUPING(class2) = 0, class2, N'Total for ' + class1) AS [Class2]
请注意使用“class1的”,而不是“等级2” ,在N'Total for ' + class1
的末尾。
第三步/最后一步是将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:ROLLUP与GROUPING行替换NULL值
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];
你的问题没有任何背景,使其可以理解的。我无法通过阅读这些内容来了解您正在尝试做什么或者出现什么问题。你可以从这里开始。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
@Sean Lange我修改了问题 – user1554650
那么问题肯定是不同的,可悲的是,它并没有比以前更清楚。我会对列的动态选择这样的查询持怀疑态度。如果你使用动态sql卡住,你将不得不跳过一些严重的障碍来解决这个问题。您需要在此处提供更多信息。你可能需要一个字符串分割器来重建你的动态sql。 –