2017-04-21 9 views
0

引用の問題が発生していると思います。私は、エラーの原因とwhileループSQL Server:forループ内の列を動的に作成するにはどうすればよいでしょうか?

SELECT 

     CAST(REPLACE([NET_VALUE_1M],',','.') as float) 
    /
    SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) 
     OVER (PARTITION BY [ID] ORDER BY [CMONTH] 
      ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_2Mp' 


     DECLARE @cnt INT =2; 
     DECLARE @cnt_total INT =12; 

     WHILE @cnt < @cnt_total 
     BEGIN 
     DECLARE @SQL NVARCHAR(MAX); 
     SET @SQL =',CAST(REPLACE([NET_VALUE_1M],',','.') as float) 
      /
      SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) 
       OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS 
        BETWEEN @cnt PRECEDING AND CURRENT ROW) 
         as ['NET_VALUE_1M_PROP_'][email protected]+['Mp']' 
     EXECUTE(@SQL) 

     SET @[email protected]+1; 
     END; 


    FROM [Channel_AGG] 

,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_2Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_3Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_4Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_5Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 5 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_6Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_7Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_8Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 8 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_9Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_10Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 10 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_11Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_12Mp' 
    ,CAST(REPLACE([NET_VALUE_1M],',','.') as float)/SUM(CAST(REPLACE([NET_VALUE_1M],',','.') as float)) OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS BETWEEN 12 PRECEDING AND CURRENT ROW) as 'NET_VALUE_1M_PROP_13Mp' 

を交換したい:

Msg 102, Level 15, State 1, Line 13
Incorrect syntax near ','.

Msg 156, Level 15, State 1, Line 20
Incorrect syntax near the keyword 'FROM'.

がどのように引用作業はSQLコマンドを宣言するのですか?私は['オープニング・クォートと']クローズ・クォートを試しましたが、ここに示すようにHow to create/add columns using a variable in a loopですが、エラーは続きます。だから、SQL Server 2014のfor-loopの中で最初のコマンドを作成するには?

+1

まずは@SQLを宣言してください。 – Jeremy

+0

@Jeremy正しい、 'DELARE @SQL NVARCHAR(MAX)'ですが、引用の問題は持続します。 – hhh

+0

まあ、それはあなたのコードに含まれていません...私たちは精神ですか? :) – Jeremy

答えて

1

コードの不完全な断片を実行しようとしたときに何をしようとしているのかわかりませんが、引用符の問題は、1つの引用符に2つの単一引用符を使用することで解決できます。文字列。例:

',CAST(REPLACE([NET_VALUE_1M],'','',''.'') as float) 
      /
      SUM(CAST(REPLACE([NET_VALUE_1M],'','',''.'') as float)) 
       OVER (PARTITION BY [ID] ORDER BY [CMONTH] ROWS 
        BETWEEN '+convert(nvarchar(10),@cnt-1)+' PRECEDING AND CURRENT ROW) 
         as [NET_VALUE_1M_PROP_'+convert(nvarchar(10),@cnt)+'Mp]' 

連結する前に@cntを文字型に変換する必要があります。

ループ内に@sqlを宣言して、ループ内の値をリセットする代わりに、おそらく(たとえば@sql =+ ...または@sql = @sql + ...)を連結する必要があります。

ぼんやりしてexec(@sql)にしようとするのではなく、print @sqlまたはselect @sqlで作成しているものを見ることができます。