您现在的位置是:首页 >学习教程 > Sql Server不使用 LAG 计算库龄的SQL 语句网站首页学习教程
Sql Server不使用 LAG 计算库龄的SQL 语句
简介
上一篇中,讲了在Sql server 中使用LAG函数如何计算库龄,本篇中讲不使用LAG函数如何计算库龄
表结构如下:
(出入库表) (商品编号) (出入库日期) (数量)
入库 123 2020-01-01 100
入库 234 2020-01-02 100
出库 123 2020-01-03 50
出库 234 2020-01-04 50
出库 123 2020-01-05 50
出库 234 2020-01-06 50
入库 123 2020-01-07 100
入库 234 2020-01-08 100
出库 123 2020-01-09 30
出库 234 2020-01-10 30
入库 123 2020-01-11 50
入库 234 2020-01-11 50
按截止指定时间搜索结果 2020-1-20
按先进先出原则
想要达成这样的效果 计算出库龄
(商品编号) (库龄) (库存)
逻辑分析:
123 第一次入库时间是 2020-01-01 入库量是100 ,
出库时间和出库数量分别是 123 2020-01-03 50 和 123 2020-01-05 50
123这里为止第一次入库的库龄是0
123 第二次入库 2020-01-07 100
出库 123 2020-01-09 30
那么123的库存是 70 ,查 2020-1-20 的库龄就应该是 14
那么实现的SQL语句如下:
SELECT
[商品编号],
min(库存)库存,
DATEDIFF( DAY, min([出入库日期]), '2020-1-20' )+1 库龄
FROM
( SELECT
[商品编号],
出入库表,
[数量],
[出入库日期],
sum(case when [出入库表]='入库' THEN [数量] else 0 end) OVER ( PARTITION BY [商品编号] )-sum(case when [出入库表]='出库' THEN [数量] else 0 end) OVER ( PARTITION BY [商品编号] ) as 库存,
SUM ( CASE WHEN [出入库表]='入库' THEN [数量] ELSE 0 END ) OVER ( PARTITION BY [商品编号] ORDER BY [出入库日期] )-SUM ( CASE WHEN [出入库表]='出库' THEN [数量] ELSE 0 END ) OVER ( PARTITION BY [商品编号] ) 操作库存
FROM
[a]
WHERE
[出入库日期] <= '2020-1-20'
) c
where 操作库存>0 and [出入库表]='入库' group by [商品编号]