2016-10-05 8 views
0

私はgrouplistという名前のストアドプロシージャにパラメータを持っています。 これは、カンマ区切りの値で列名を含みます。例えばのためのSql文字列置換の問題

:GROUPLIST = @'のClass1、Class2に、Class3の'

私のクエリは、SQL = @

設定されている#final

私から+ @grouplist +」 '選択'結果は

Table result

これらの列の値が "ZZTotal" 値が含まれています。それは "合計"で置き換える必要があります。これらは動的な列です。

合計をzztotalに置き換える必要があります。

最終的な出力では、

+4

にIDENTITY列を追加し、INTO句。私はあなたが何をしようとしているのか、それとも何が問題なのか、これを読むことからは分かりません。あなたはここから始めるかもしれません。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

@Sean Lange質問を変更しました – user1554650

+0

質問は確かに異なります残念ながらそれは以前よりもはっきりしていません。私は、このように動的に選択された列を持つクエリを疑います。あなたは動的SQLを使用して立ち往生している場合は、これを取り除くためにいくつかの深刻なハードルを飛び越さなければならないでしょう。ここではさらに多くの情報を提供する必要があります。動的SQLを再構築するには、文字列分割が必要になるでしょう。 –

答えて

2

を高く評価し、この

final output

すべてのヘルプは無視されている大きな問題があるようにする必要があります。テキストがすでにある可能性が最も高い理由があるが、 Totalの代わりにZZTotalです。その理由は、適切な行順序を維持する(すなわち、合計を最下部に維持する)ために最も可能性が高い。

ZZTotal行は、GROUP BY句のROLLUPオプションを使用してSQL Serverによって自動的に生成される可能性が最も高いです。最初にROLLUPオプションは、文字列 "Total"(または任意の文字列)が文字列以外のデータ型の列に収まらないため、ロールアップされている各 "グループ"にNULLを配置します。結果を#finalにダンプすると、NULLの値がZZTotalで置き換えられました(ISNULL())。

現在の問題は、あなたがTotalZZTotal値を置き換える場合は、「合計」行はおそらく、少なくともないU...で始まる文字列を含む任意のグループ化のために、そのグループの下部にはならないだろうということである、またはTp... 、またはTou...などです。

  1. 最初のステップは、#finalテーブルにIDENTITY列を追加することです。これを行うには、#finalを作成して入力するクエリを変更してIDENTITY(INT, 1, 1) AS [RowNum],SELECTステートメントの最初の列として追加します。

  2. 第二段階ではなく、(例えばクラス2、など)であることを#finalを移入するクエリのISNULL(column, 'ZZTotal')を変更することです:

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

    「クラス2」、「クラス1」の使用はありませんのでご注意ください、末尾にN'Total for ' + class1

  3. 第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:行

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; 
をグループ化するに置き換え、NULL値とROLLUP最終クエリのようなものでなければなりません

例3:あなたの質問は、それが理解できるようにする任意のコンテキストを欠い例#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

いいです!それは鉱山よりもはるかに有益な答えです(削除されました)。 1つの*愚かな*質問、私はロールアップでグループを使用していない、それは常に自動的に合計ZZを追加するか、これはあなたが手動で追加するものですか? – gofr1

+0

@ gofr1いいえ、「ROLLUP」はすべてのデータ型で使用できる唯一の一般的な「値」であると思われるため、「NULL」を使用する必要があります。 「Total」と「ZZTotal」は、ここで説明したように、事実の後に手動で「ISNULL」または「IIF」/「CASE」で追加されます。 –

+0

ありがとうございます。 – gofr1