繁体   English   中英

如何从第2行中减去第1行并将结果插入SQL Server中的第3行中?

[英]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)

我看到我可以使用leadlag功能,但我完全迷路了。

您可以为此使用聚合:

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()函数完成。

请注意,这很可能不是一个好主意,因为它将冗余引入到数据中。 视图(或用户查询)通常是执行此计算的更好位置。 说:

LEADLAG如何使用它取决于表中可能还有其他数据。 要按照说明直接执行更新(无需担心表中的其他数据,假设至少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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM