Sql 通过基于多个ID从两个不同的行中减去列值来创建自定义字段

Sql 通过基于多个ID从两个不同的行中减去列值来创建自定义字段,sql,sql-server,tsql,Sql,Sql Server,Tsql,我必须通过基于多个ID从两个不同的行中减去列值来创建自定义列 数据集如下所示: ------------------------------------------ Date | Name | ID1 | ID2 | Value ------------------------------------------ 2020-03-01 | ABC | 50 | 75 | 2000 2020-03-02 | ABC | 50 | 75 | 3000 2020-0

我必须通过基于多个ID从两个不同的行中减去列值来创建自定义列

数据集如下所示:

------------------------------------------
Date       | Name | ID1  | ID2  | Value
------------------------------------------
2020-03-01 | ABC  | 50   | 75   | 2000
2020-03-02 | ABC  | 50   | 75   | 3000
2020-03-03 | ABC  | 50   | 75   | 3140
2020-03-01 | ABC  | 50   | 76   | 5000
2020-03-02 | ABC  | 50   | 76   | 6000
2020-03-03 | ABC  | 50   | 76   | 6145
2020-03-01 | ABC  | 50   | 77   | 5000
2020-03-02 | ABC  | 50   | 77   | 6000
2020-03-03 | ABC  | 50   | 77   | 6145
---------------------------------------------------
Date       | Name | ID1  | ID2  | Value |  Custom 
--------------------------------------------------
2020-03-01 | ABC  | 50   | 75   | 2000  | 1000 (3000-2000)
2020-03-02 | ABC  | 50   | 75   | 3000  | 140  (3140 -3000)
2020-03-03 | ABC  | 50   | 75   | 3140  | Next date Value - 3140 
...

...
ID2对于每个日期都是不同的。现在我必须显示自定义字段,如下所示:

------------------------------------------
Date       | Name | ID1  | ID2  | Value
------------------------------------------
2020-03-01 | ABC  | 50   | 75   | 2000
2020-03-02 | ABC  | 50   | 75   | 3000
2020-03-03 | ABC  | 50   | 75   | 3140
2020-03-01 | ABC  | 50   | 76   | 5000
2020-03-02 | ABC  | 50   | 76   | 6000
2020-03-03 | ABC  | 50   | 76   | 6145
2020-03-01 | ABC  | 50   | 77   | 5000
2020-03-02 | ABC  | 50   | 77   | 6000
2020-03-03 | ABC  | 50   | 77   | 6145
---------------------------------------------------
Date       | Name | ID1  | ID2  | Value |  Custom 
--------------------------------------------------
2020-03-01 | ABC  | 50   | 75   | 2000  | 1000 (3000-2000)
2020-03-02 | ABC  | 50   | 75   | 3000  | 140  (3140 -3000)
2020-03-03 | ABC  | 50   | 75   | 3140  | Next date Value - 3140 
...

...
对其他ID2也重复

请建议我应该如何进行。我尝试过使用
交叉连接
,但没有得到理想的结果。

使用
lead()

试试这个:

DECLARE @DataSource TABLE
(
    [Date] DATE
   ,[Name] CHAR(3)
   ,[ID1] TINYINT
   ,[ID2] TINYINT
   ,[Value] INT
);

INSERT INTO @DataSource ([Date], [Name], [ID1], [ID2], [Value])
VALUES ('2020-03-01', 'ABC ', '50', '75', '2000')
      ,('2020-03-02', 'ABC ', '50', '75', '3000')
      ,('2020-03-03', 'ABC ', '50', '75', '3140')
      ,('2020-03-01', 'ABC ', '50', '76', '5000')
      ,('2020-03-02', 'ABC ', '50', '76', '6000')
      ,('2020-03-03', 'ABC ', '50', '76', '6145')
      ,('2020-03-01', 'ABC ', '50', '77', '5000')
      ,('2020-03-02', 'ABC ', '50', '77', '6000')
      ,('2020-03-03', 'ABC ', '50', '77', '6145');

SELECT *
     ,LEAD([Value]) OVER (PARTITION BY [Name], [ID1], [ID2] ORDER BY [Date] ASC)
     ,CONCAT(LEAD([Value]) OVER (PARTITION BY [Name], [ID1], [ID2] ORDER BY [Date] ASC) - [value], ' (', LEAD([Value]) OVER (PARTITION BY [Name], [ID1], [ID2] ORDER BY [Date] ASC), ' -', [value],')')
FROM @DataSource
ORDER BY [Date]

您可以在最终的
CONCAT
中添加更多逻辑,以便以不同的方式形成结果。例如,如果没有要获取的
下一个值
,您可以将值
保留为空

请包含
下一个日期值-3140的实际值。。。我们无法推断这一点。两个答案都是正确的。非常感谢你的帮助。