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

时间:2017-03-02 16:00:17

标签: sql sql-server tsql

我正在寻找帮助,以便找到可以从RANK_1中减去RANK_5的回报的代码,然后将结果插入行RANK_5M1

enter image description here

以下是表格的代码:

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函数,但我完全迷失了。

3 个答案:

答案 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')

Demo

工作原理:

如果助记符为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)

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

这对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'

答案 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
                     ;