2016-08-04 6 views
0

私のコードは次のとおりです。がピボットにnull値を持つ動的な列を合計する

DECLARE @cols AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.column_3) 
     FROM table_c c 
     where Code = 123 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

exec('SELECT column_1, ' + @cols + ' from 
     (
      select column_1 
       , column_2 
       , column_3 
      From table_c where Code = 123 
     ) x 
     pivot 
     (
      sum(column_2) 
      for column_3 in(' + @cols + ') 
     ) p 
     ' 
     ) 

と私は唯一の列を@cols追加すると、合計などの新しい列に結果を持っています。これらの列はヌル値を持つことがあります。


私はより多くを説明してみましょう:

必要として私を与えるコードは、私は私の上記のコードでは

@cols = '[c.column_3_value_1],[c.column_3_value_1],...[c.column_3_value_N]' 

を得た方法として、この

@sum_cols = 'ISNULL([c.column_3_value_1],0) + ISNULL([c.column_3_value_2],0) + ... + ISNULL([c.column_3_value_N],0)' 

が好きSTH。

(この「c.column_3_value _...の任意の文字を持っており、定期的ではありませんでした)

と、このように私のexecのクエリでこの@sum_colsを使用します。私は理解していれば

exec('SELECT column_1, ' + @cols + ' , ' + @sum_cols + ' As sum from 
    (
     select column_1 
      , column_2 
      , column_3 
     From table_c where Code = 123 
    ) x 
    pivot 
    (
     sum(column_2) 
     for column_3 in(' + @cols + ') 
    ) p 
    ' 
    ) 
+0

タグを使用するDBMS。 (そのコードはANSI SQLにはありません) – jarlh

答えて

0

これはどういう意味ですか?

は、私はあなたがexecの後の最初のサブクエリの前に「から」キーワードを忘れてしまったと思う...あなたがそうでなければ実行できません貼り付け コード...

DECLARE @cols AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.column_3) 
     FROM table_c c 
     where Code = 123 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

exec('SELECT column_1, ' + @cols + ' 
     FROM 
     (
      select column_1 
       , column_2 
       , column_3 
      From table_c where Code = 123 
     ) x 
     pivot 
     (
      sum(column_2) 
      for column_3 in(' + @cols + ') 
     ) p 
     ' 
     ) 
+0

ありがとうございます。あなたの権利は私がそれを修正しましたが、私のコードでは 'from'というキーワードがあり正しく動作します。私はちょうど別の列が名前と列の数で知られていないそれらの@cols列の各行を合計するようにします。 –

+0

また、元のテーブルデザインを含めることができます... – Sander

0

正確には、column_3の値だけを入力します。column_2の対応する値には、NULL以外の値が少なくとも1つあります。

あなたはHAVING句でGROUP BYを使用して、これを手配することができます:

SET @cols = STUFF((SELECT ',' + QUOTENAME(c.column_3) 
        FROM table_c c 
        WHERE Code = 123 
        GROUP BY c.column_3 
        HAVING COUNT(column_2) > 0 
        FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)' 
         ), 1, 1, ''); 

HAVING句は、他の目的のために拡張することができる - など最低限の数を確保することや、すべての列が値を持っていることを保証するように。しかし、私はこれがあなたが望むバージョンだと思う。

+0

thanxで応答しますが、column_2の値はピボットテーブルの新しい列としてcolumn_3の値を持つことは重要ではありません。私は、新しい列の各行のピボットテーブルの@cols([necolumn_1]、[newcolumn_2]、...)列の合計を、各列にNULL値があるかどうかで合計したいだけです。 –

関連する問題