ぐ~たら ぷろぐらまー にっき

最近すぐ忘れるけー。

<SQL> Lag関数

SQLServer2012以降

同じ結果セットの前の行からデータにアクセスする。
現在の行の値と前の行の値を比較できる。

やりたいことは、
年月毎に持っているデータで、当月金額と前月金額を表示したい。
前月金額は先月のデータの当月金額を表示したい。
内部結合で考えていたけど、Lag関数というのがあるらしいので調べてみた。

LAG (scalar_expression [,offset] [,default])  
    OVER ( [ partition_by_clause ] order_by_clause )  


LAG (Transact-SQL) | Microsoft Docs

SELECT 年月日,部門CD,当月仕掛,lag(当月仕掛,1,0) over(partition by 部門CD order by 年月日) as 前月仕掛
FROM Table1


f:id:nekobasu6126:20180831160940p:plain

すっきりしていいんだけど、途中のデータが抜けた場合に困るかも。
2018年06月の次に2018年08月のデータが入った場合、6月データ見にいくみたい。

なのでやっぱり内部結合でダラダラ書こうかな。

With MM As
(
SELECT [部門CD] as '部門CD',[部門名] as '部門名' FROM TableBMN
)
 SELECT MM.[部門CD],MM.[部門名],TBL2.前月仕掛,Tbl.*
FROM MM
LEFT OUTER JOIN (SELECT * FROM Table1 WHERE left([年月日],6)='201807') as Tbl 
ON MM.[部門CD] = tbl.[部門CD]
LEFT OUTER JOIN (SELECT 部門CD,前月仕掛 FROM Table1  WHERE left([年月日],6)='201806') as Tbl2 
ON MM.[部門CD] = Tbl2.[部門CD]

年月はパラメータで渡す、と。