Sql字符串替换问题

时间:2016-10-05 14:20:23

标签: sql sql-server sql-server-2008

我在存储过程中有一个名为grouplist的参数。 它包含逗号分隔值的列名。

例如: @grouplist =' Class1,Class2,Class3'

我的查询是

设置@ Sql ='选择' + @grouplist +'来自#final

我的结果是

Table result

这些列包含值" ZZTotal"值。它应该替换为" Total"这些是动态专栏。

我需要将zztotal替换为total。

在最终输出中它应该是这样的

final output

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:2)

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

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

当前的问题是,如果您将ZZTotal值替换为Total,那么“总计”行可能不会位于该分组的底部,至少不会包含任何包含的分组以U...Tp...Tou...开头的字符串,依此类推。

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

  2. 第二步是将填充ISNULL(column, 'ZZTotal')的查询的#final更改为(例如,对于Class2):

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

    请注意N'Total for ' + class1末尾使用“class1”而非“class2”。

  3. 第三步/最后一步是将ORDER BY [RowNum]添加到Set @Sql=语句的末尾。最终的查询应该是这样的:

    SELECT Class1, Class2, Class3 FROM #final ORDER BY [RowNum];
    
  4. 示例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];