计算MonthlyVolume - PIVOT SQL

时间:2014-08-05 15:03:52

标签: sql

我正在使用SQL Server 2008,我跟随表有数百万行......以下是一些示例记录

Serial_Num  ReadingDate M_Counter   Dyn_Counter
XYZ 3/15/2014   100 190
XYZ 4/18/2014   140 240
XYZ 5/18/2014   200 380
ABC 3/12/2014   45  40
ABC 4/19/2014   120 110
ABC 5/21/2014   130 155

这个表每个月只有一个读数,没有错过的月份......

我想计算每个月的M_Counter和Dyn_Counter值,例如XYZ - > 5月计算的计数器值应为60 = 200(2014年5月18日值) - 140(2014年4月18日值)。我想以下列方式将数据插入另一个表中。

CalculatedYear  CalculatedMonth Serial_Num  M_Counter_Calc  Dyn_Counter_Calc
2014    4   XYZ 40  50
2014    5   XYZ 60  140
2014    4   ABC 75  70
2014    5   ABC 10  45

任何帮助真的很感激!

1 个答案:

答案 0 :(得分:0)

如果您正在使用MS SQL,那么这样的事情应该有效。该概念是基于Serial_Num和ReadingDate对数据集进行排序。添加顺序行ID并存储到临时表中。将表连接到自身,以便将当前行与序列号仍匹配的上一行匹配。如果没有前一个月的读数,则该值将为空。我们在进行计算时使用Isnull(x,0)来解释这一点。

declare @Temp1 table
(
RowID int,
Serial_Num varchar(3),
ReadingDate datetime,
M_Counter int,
Dyn_Counter int
)


insert into @Temp1
select ROW_NUMBER() over (order by Serial_Num, ReadingDate), * 
from MyTable T


select 
Year(T1.ReadingDate) As CalculatedYear, 
Month(T1.ReadingDate) as CalculatedMonth,
T1.Serial_Num, 
T1.M_Counter - ISNULL(T2.M_Counter,0) as Calculated_M_Counter, 
T1.Dyn_Counter - isnull(T2.Dyn_Counter,0) as Calculated_Dyn_Counter
from @Temp1 T1
left outer join @Temp1 T2 on T1.RowID = T2.RowID + 1 and T1.Serial_Num = T2.Serial_Num 
order by T1.Serial_Num, Year(T1.ReadingDate), Month(T1.ReadingDate)