我正在寻找帮助,以便找到可以从RANK_1
中减去RANK_5
的回报的代码,然后将结果插入行RANK_5M1
。
以下是表格的代码:
CREATE TABLE [dbo].[MOMENTUM_Money]
(
[MNEMONIC] [varchar](50) NULL,
[2006-12-30] [money] NULL,
[2007-01-30] [money] NULL,
[2007-02-28] [money] NULL
) ON [PRIMARY]
GO
INSERT INTO momentum_money (MNEMONIC, [2006-12-30], [2007-01-30], [2007-02-28])
VALUES ('RANK_1', 131.8389, 141.1965, 147.9428),
('RANK_5', 36150.3798, 40087.5547, 38068.4299)
我看到我可以使用lead
和lag
函数,但我完全迷失了。
答案 0 :(得分:2)
您可以使用聚合:
insert into MOMENTUM_Money
select 'Rank_5M1',
sum([2006-12-30] * case when mnemonic = 'Rank_5' then 1 else - 1 end) [2006-12-30],
sum([2007-01-30] * case when mnemonic = 'Rank_5' then 1 else - 1 end) [2007-01-30],
sum([2006-02-28] * case when mnemonic = 'Rank_5' then 1 else - 1 end) [2007-02-28]
from MOMENTUM_Money
where mnemonic in ('Rank_1', 'Rank_5')
如果助记符为Rank_5,则case语句产生1,否则为-1。
我们想要做的是mnemonic when rank_5
- mnemonic when rank_1
,可以表示为 - mnemonic * (1 when rank_5)
+ mnemonic * (-1 when rank_1)
。 1和-1由case生成,求和由sum()函数完成。
答案 1 :(得分:1)
请注意,这可能是一个坏主意,因为它会在您的数据中引入冗余。视图(或用户查询)通常是执行此计算的更好位置。那说:
这对LEAD
或LAG
的处理方式取决于表格中可能包含的其他数据。要直接执行所描述的更新(不考虑表中的其他数据,假设至少mnemonic
是唯一的),您可以执行类似
UPDATE momentum_returns
SET [2006-12-30] = R5.[2006-12-30] - R1.[2006-12-30],
[2007-01-30] = R5.[2007-01-30] - R1.[2007-01-30],
[2007-02-28] = R5.[2007-02-28] - R1.[2007-02-28]
FROM momentum_returns AS R5
inner join momentum_returns AS R1
on R5.MNEMONIC = 'RANK_5'
and R1.MNEMONIC = 'RANK_1'
WHERE momentum_returns.MNEMONIC = 'RANK_5M1'
答案 2 :(得分:0)
DECLARE @TABLENAME AS VARCHAR(max);
DECLARE @COLUMN1 AS VARCHAR(max);
DECLARE @COUNTER INT;
DECLARE @R1 as money, @R5 as money
DECLARE @SQL as VARCHAR(MAX)
SET @TABLENAME = 'MOMENTUM_Results';
SET @COUNTER = 2;
WHILE @COUNTER<=4
BEGIN
SELECT @COLUMN1 = C.Name
FROM sys.Columns C
WHERE OBJECT_NAME(C.object_id) = @TABLENAME
AND C.column_id = @COUNTER
;
SET @SQL = 'DECLARE @R1 as money; DECLARE @R5 as money;
SET @R1 = (SELECT [' + @COLUMN1 + '] FROM MOMENTUM_Results WHERE MNEMONIC = ''RANK_1'');
SET @R5 = (SELECT [' + @COLUMN1 + '] FROM MOMENTUM_Results WHERE MNEMONIC = ''RANK_5'');
UPDATE MOMENTUM_Results SET [' + @COLUMN1 + '] = @R1 - @R5 WHERE MNEMONIC = ''RANK_5M1'''
EXECUTE (@SQL)
SET @COUNTER = @COUNTER + 1;
END
;