带有数据聚合

时间:2017-01-30 15:54:08

标签: sql sql-server tsql pivot transpose

我有一个简单的问题。我想要一个具有不同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

如果可以在视图或存储过程中创建类似的内容,那就太棒了。

感谢您的帮助。

1 个答案:

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