2017-04-21 63 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循環中創建初始命令?

+1

你如何首先聲明@SQL? – Jeremy

+0

@Jeremy正確,'DELARE @SQL NVARCHAR(MAX)',但引用問題依然存在。 – hhh

+0

好吧,它不包含在你的代碼中......我們是否是心靈的? :) – Jeremy

回答

1

我不知道你想要做什麼,或者你想到什麼試圖執行的代碼,不完整碎片時發生,但你引用的問題可以通過使用兩個單引號內的每一個單引號來解決串。例如:

',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 @sqlselect @sql而不是。