如何为(yyyy-mm-dd)格式的列创建循环?

时间:2017-02-27 17:06:29

标签: sql sql-server tsql

文摘: 我有两个表,一个有股票的回报,另一个有各自的五分位数,我想计算最高五分位数和最低五分位数的平均值,因此我使用左联接函数但仍然无法进一步因为我的循环不起作用。

表一(返回)小样本(121列) enter image description here

表二(五分位数)小样本(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); 

因此,寻找一个好的见解,找到我如何使用我创建的函数循环遍历这些列。谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

试试这个:

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;