Sql 通过基于多个ID从两个不同的行中减去列值来创建自定义字段
我必须通过基于多个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
------------------------------------------
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的实际值。。。我们无法推断这一点。两个答案都是正确的。非常感谢你的帮助。