我有一个简单的问题。我想要一个具有不同PK的列之间的DELTA。
我的数据库中有这个表结构:
RecordID | Time | ColA | ColB | ColC
1 | 2016 | 1 | 1 | 2
1 | 2017 | 2 | 3 | 2
2 | 2016 | 4 | 1 | 1
2 | 2017 | 2 | 1 | 1
PK:RecordID和时间。
我想看到的是:
ColName | Time | Delta
ColA | 2016 | -3
ColA | 2017 | 0
ColB | 2016 | 0
ColB | 2017 | 2
ColC | 2016 | 1
ColC | 2017 | 1
基本上:2016年的ColA和2017年的RecordID 1减去ColA和记录2
如果可以在视图或存储过程中创建类似的内容,那就太棒了。
感谢您的帮助。
答案 0 :(得分:0)
这应该做你想要的。首先,取消表格以便以更易于管理的形式获取记录。然后自联接,以便您使用相同的时间和列名称加入到recordID中的上一个条目。我认为这是可以合理扩展的。我不是SQL专家,但这似乎完成了工作。
;WITH CTE AS
(SELECT * FROM test
UNPIVOT (
Value FOR column_name IN
(ColA, COlB, COlC)
)AS unpvt
)
SELECT CTE1.column_name,
CTE1.time,
CTE1.value - CTE2.value AS Delta
FROM CTE AS CTE1
INNER JOIN CTE AS CTE2
ON CTE2.time = CTE1.time
AND cte1.column_name = cte2.column_name
AND CTE1.recordID = CTE2.recordID - 1