[英]How to subtract row 1 from row 2 and insert the result in row 3 in SQL Server?
我正在寻求帮助,以找到可以从RANK_5
减去RANK_1
的返回值,然后将结果插入到RANK_5M1
行中的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
功能,但我完全迷路了。
您可以为此使用聚合:
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 when rank_1
mnemonic when rank_5
mnemonic when rank_1
,可以将其表示为- mnemonic * (1 when rank_5)
为mnemonic * (1 when rank_5)
+ mnemonic * (-1 when rank_1)
。 1和-1由情况产生,求和由sum()函数完成。
请注意,这很可能不是一个好主意,因为它将冗余引入到数据中。 视图(或用户查询)通常是执行此计算的更好位置。 说:
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'
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
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.