2016-10-14 16 views
3

私は前月の請求書の値が何だったのかを検討し、現在の値と同じ行に入れようとしています。上記の行に基づいて計算するSQL

私はSQL Server.Microsoft SQL Server 2008 R2の私は、CTEのと奇妙な結合のすべての種類使用して私の運を試してみた

(SP2)を、使用していますが、私の出力は決して正しいです。誰かが私を正しい方向に向けることができますか?

例テーブル:

invoice_month value 
-------------------------- 
    201510  337265.386 
    201511  335466.456 
    201512  338646.500 
    201601  333440.380 
    201602  330731.208 
    201603  339299.752 
    201604  340878.168 
    201605  359585.382 
    201606  339616.430 
    201607  316457.486 
    201608  308009.976 
    201609  232196.268 
    201610  894839.180 
    201611  232196.268 
    201612  232196.268 
    201701  232196.268 
    201702  232196.268 
    201703  232196.268 

の予想される出力は次のようになります。SQL Serverの2012+では

invoice_month value,   prevValue 
-------------------------------------------- 
    201510  337265.386, NULL 
    201511  335466.456, 337265.386 
    201512  338646.500, 335466.456 
    201601  333440.380, 333440.380 
    201602  330731.208, 333440.380 
    201603  339299.752, 330731.208 
    201604  340878.168, 339299.752 
    201605  359585.382, 340878.168 
    201606  339616.430, 359585.382 
    201607  316457.486, 339616.430 
    201608  308009.976, 316457.486 
    201609  232196.268, 308009.976 
    201610  894839.180, 232196.268 
    201611  232196.268, 894839.180 
    201612  232196.268, 232196.268 
    201701  232196.268, 232196.268 
    201702  232196.268, 232196.268 
    201703  232196.268, 232196.268 
+1

質問よく提起が、それは困難/不可能なものとして、あなたがにしているどのバージョンを知るために、SQL Serverに関する質問には本当に便利だことができます突然新機能で可能/容易になる。 – AakashM

答えて

3

前2012:

;with cte 
as 
(select invoice_month,value, 
row_number() over (order by invoice_month) as rn 
from #temp ) 
select c1.*,c2.value 
from cte c1 
left join 
cte c2 
on c1.rn=c2.rn+1 
4

、あなたがlag()を使用します。

select t.invoice_month, t.value, 
     lag(t.value) over (order by t.invoice_month) as prev_value 
from t; 

これはANSI標準関数であります。以前のバージョンのSQL Serverには、別の方法があります。

バージョンの
0
SELECT * 
FROM (SELECT TOP 1 invoice_month, 
        value, 
        NULL AS [Previous value] 
     FROM Invoice 
     ORDER BY invoice_month ASC) T 
UNION 
SELECT I.invoice_month, 
     I.value, 
     I1.value AS [Previous value] 
FROM Invoice I 
     INNER JOIN Invoice I1 
       ON I.invoice_month - 1 = I1.invoice_month 
関連する問題