2016-10-05 71 views
0

我在名为grouplist的存储过程中有一个参数。 这包含逗号分隔值中的列名称。Sql字符串替换问题

为如:@ GROUPLIST = '的Class1,Class2中,Class3的'

我的查询是

集@的Sql = '选择' + @grouplist从#final

+”我结果是

Table result

这些列中包含值 “ZZTotal” 值。它应该被替换为“总计”。这些是动态栏。

我需要用总数替换zztotal。

在最后的输出应该是这样的

final output

任何帮助表示赞赏

+4

你的问题没有任何背景,使其可以理解的。我无法通过阅读这些内容来了解​​您正在尝试做什么或者出现什么问题。你可以从这里开始。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

@Sean Lange我修改了问题 – user1554650

+0

那么问题肯定是不同的,可悲的是,它并没有比以前更清楚。我会对列的动态选择这样的查询持怀疑态度。如果你使用动态sql卡住,你将不得不跳过一些严重的障碍来解决这个问题。您需要在此处提供更多信息。你可能需要一个字符串分割器来重建你的动态sql。 –

回答

2

有是被忽略一个更大的问题:有是最有可能的一个原因,文本已经ZZTotal而不是Total。而这个原因很可能是为了保持正确的排序(即保持总数在最低)。

ZZTotal行很可能是由SQL Server通过GROUP BY子句的ROLLUP选项自动生成的。最初,ROLLUP选项将NULL置于每个正在汇总的“组”中,因为字符串“Total”(或任何字符串)不适合一列非字符串数据类型。我猜测当将结果转储到#final时,NULL值被替换为ZZTotal通过ISNULL()

目前的问题是,如果你与Total更换ZZTotal值,则“总计”行会可能不会在该分组的底部,至少不是包含字符串的开头U...,或Tp...任何分组,或Tou...,等等。

  1. 的第一步是将IDENTITY列添加到#final表。您可以通过更改创建并填充#final的查询来添加IDENTITY(INT, 1, 1) AS [RowNum],作为SELECT语句的第一列。

  2. 第二步是改变这种填充#final,而不是成为查询(等级2,例如)的ISNULL(column, 'ZZTotal')

    IIF(GROUPING(class2) = 0, class2, N'Total for ' + class1) AS [Class2] 
    

    请注意使用“class1的”,而不是“等级2” ,在N'Total for ' + class1的末尾。

  3. 第三步/最后一步是将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]; 
+0

不错!这比我的信息更丰富的答案(删除)。一个*愚蠢的问题,我没有使用group by by rollup,它总是自动添加ZZ,或者这是手动添加的东西? – gofr1

+0

@ gofr1否,'ROLLUP'必须使用'NULL',可能是因为它是唯一可以在所有数据类型中使用的常见“值”。正如我在这里所描述的那样,通过“ISNULL”或“IIF”/“CASE”手动添加“Total”和“ZZTotal”。 –

+0

谢谢,澄清! – gofr1