Sql server SQL Server:引用如何在for循环内动态创建列?

Sql server SQL Server:引用如何在for循环内动态创建列?,sql-server,for-loop,sql-server-2014,quotes,declare,Sql Server,For Loop,Sql Server 2014,Quotes,Declare,我想我的报价有问题。我想换一个 ,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_

我想我的报价有问题。我想换一个

  ,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'
带一个while循环

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_']+@cnt+['Mp']'
      EXECUTE(@SQL)

        SET @cnt=@cnt+1;
      END;


  FROM [Channel_AGG]
导致错误的原因:

Msg 102,15级,状态1,第13行 “,”附近的语法不正确

Msg 156,第15级,状态1,第20行 关键字“FROM”附近的语法不正确


引用如何声明SQL命令?如图所示,我尝试了['开始报价']和']结束报价,但错误仍在继续。因此,要在SQL Server 2014中的for循环中创建初始命令?

我不确定您想做什么,或者在尝试执行不完整的代码片段时会发生什么,但您的引用问题可以通过为字符串中的每个单引号使用两个单引号来解决。e、 g:

 ',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创建的内容,或者选择@sql

你先声明@SQL怎么样?@Jeremy正确,DELARE@SQL NVARCHARMAX,但是引用问题仍然存在。好吧,它不包括在你的代码中。。。我们是通灵的吗对不起,但不是那样工作的。您必须在字符串变量中构建整个SQL语句,然后执行它。你能解释一下为什么你想放弃第一种方法吗?输出列的数量是否不断变化?