2017-02-27 2 views
1

抄録: 私は2つのテーブルを持っています.1つは株式のリターンで、もう1つはそれぞれの5分位のテーブルで、トップの5分の1と1の平均を計算したいので、私のループは機能しないので、さらに進んでいきます。(yyyy-mm-dd)形式の列のループを作成する方法は?

表1(リターン)小サンプル(121列) enter image description here

表2つ(五分位)小サンプル(121列) enter image description here

コードが使用:

   DECLARE @CDate as date, @SQL as varchar (max) 


       SET @CDate = '2006-12-30' -- dates as string must be yyyy-mm-dd 

       WHILE @CDate < '2016-12-31' 
         BEGIN 


          SET @SQL = 'SELECT AVG(MR.[' & @CDATE & ']) From MOMENTUM_Quintile MQ Left Join MOMENTUM_Returns MR on MQ.Mnemonic = MR.Mnemonic WHERE MQ.[' & @CDATE & '] = 1' 



          SET @CDate = DATEADD(mm, 1, @CDate) 
          WHILE Month(@CDate) = Month(DATEADD(dd, 1, @CDate)) 
           BEGIN 
            SET @CDate = DATEADD(dd, 1, @CDate) 
           END 
         END 

エラーメッセージ:

    Msg 402, Level 16, State 1, Line 14 
        The data types varchar and date are incompatible in the '&' operator. 
したがって、これらの列を通してどのように可能性があり、私はループ、私が作成した関数を使用して見つけるのに良い洞察を探して

  CREATE TABLE [dbo].[MOMENTUM_Money](

       [MNEMONIC] [varchar](50) NULL, 

       [2006-12-30] [money] NULL, 

       [2007-01-30] [money] NULL, 

       [2007-02-28] [money] NULL, 

       [2007-03-30] [money] NULL, 

       [2007-04-30] [money] NULL, 

       [2007-05-30] [money] NULL, 

       [2007-06-30] [money] NULL 

      ) ON [PRIMARY] 

     GO 


       INSERT INTO momentum_returns (MNEMONIC,[2006-12-30], [2007-01-30], [2007-02-28], [2007-03-30], [2007-04-30], [2007-05-30], [2007-06-30]) 

       VALUES ('AAL', 510.1708, 489.0758, 494.8104, 557.2972, 555.6318, 606.8441, 613.0896), 

       VALUES ('ABF',-6.5341 -6.4193 -6.5301 -6.8388 -7.3335 -7.385 -7.0781), 

       VALUES ('ACB', 6.9713, 6.578, 6.559, 7.2885, 6.9103, 6.3598, 5.7575), 

       VALUES ('ABC', 1.4600, 1.5030, 1.5352, 1.5609, 1.5447, 1.5609, 1.7493); 

:ここ

はあなたのためのコードを試すことのできる小さなサンプルテーブルです。ありがとうございます

+0

を、 '&' '+'にを変更してみてください。 – DVT

+0

同じメッセージを送信します.. –

+1

なぜ列として日付がありますか?これらは、日付列を持つ行でなければなりません。デザインが非正規化されていると、クエリが大幅に難しくなります。 –

答えて

1

これを試してみてください: `` @SQL = ...&@cDATE SET&...で

DECLARE @CDate AS DATE, @SQL AS VARCHAR(MAX); 
SET @CDate = '2006-12-30'; -- dates as string must be yyyy-mm-dd 
    WHILE @CDate < '2016-12-31' 
     BEGIN 
      PRINT 'This'; 
      SET @SQL = 'SELECT AVG(MR.['+CAST(@CDATE AS NVARCHAR(MAX))+']) 
          From MOMENTUM_Quintile MQ 
          Left Join MOMENTUM_Returns MR on MQ.Mnemonic = MR.Mnemonic 
          WHERE MQ.['+CAST(@CDATE AS NVARCHAR(MAX))+'] = 1';   
      SET @CDate = DATEADD(mm, 1, @CDate); 
      WHILE MONTH(@CDate) = MONTH(DATEADD(dd, 1, @CDate)) 
       BEGIN 
        SET @CDate = DATEADD(dd, 1, @CDate); 
       END; 
     END; 
1

どのようにこのような何かについては?

DECLARE @CDate as date, @SQL as varchar (max), @cDateString nvarchar(20) 


SET @CDate = '2006-12-30' -- dates as string must be yyyy-mm-dd 

WHILE @CDate < '2016-12-31' 
     BEGIN 

      SET @cDateString = CONVERT(NVARCHAR(4),YEAR(@cDate)) + N'-' + FORMAT(MONTH(@cDate),'d2') + N'-' +FORMAT(DAY(@cDate),'d2') 
      SET @SQL = 'SELECT AVG(MR.[' + @cDateString + ']) From MOMENTUM_Quintile MQ Left Join MOMENTUM_Returns MR on MQ.Mnemonic = MR.Mnemonic WHERE MQ.[' + @cDateString + '] = 1' 



      SET @CDate = DATEADD(mm, 1, @CDate) 
      WHILE Month(@CDate) = Month(DATEADD(dd, 1, @CDate)) 
       BEGIN 
        SET @CDate = DATEADD(dd, 1, @CDate) 
       END 
     END 
関連する問題