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