Sql Server 有关库龄的问题代码如何编写

(出入库表) (商品编号) (出入库日期) (数量)
入库 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

按截止指定时间搜索结果 2020-2-20
按先进先出原则

想要达成这样的效果
(商品编号) (库龄) (库存)
123 40 70
234 41 70

declare @dt datetime
set @dt='2020-1-20'

declare @t1 table ( pid char(18),datetime datetime, amount int)
insert @t1 select '123', '2020-01-01', 1000
union select '123', '2020-01-15', 1000
union select '234', '2020-01-01', 1000
union select '234', '2020-01-15', 1000

declare @t2 table ( pid char(18),datetime datetime, amount int)
insert @t2 select '123', '2020-01-01', 50
union select '123', '2020-01-02', 50
union select '123', '2020-01-05', 50
union select '234', '2020-01-01', 50
union select '234', '2020-01-02', 50
union select '234', '2020-01-05', 50

select t1.pid,DATEDIFF(day,t1.maxDate,@dt)+1 '库龄',(t1.totalNum - t2.totalNum) '库存' from

(select pid,max(datetime) maxDate,sum(amount) totalNum from @t1 where DATEDIFF(day,datetime,@dt)>=0 group by pid) t1

left join (select pid,sum(amount)totalNum from @t2 where DATEDIFF(day,datetime,@dt)>=0 group by pid) t2 on t1.pid=t2.pid

按你的还是不正确
应该的到的是

123 20 1850
234 20 1850

结果库龄是 6 就是第二次进货的库龄了, 实际是第一次没销售完,就库龄就还是第一次的进货时间

应该可以满足你的需求(你问题中的[出入库表]应该是字段标识,而不是表名,不知道是不是你的笔误):

select
t1.商品编号,
DATEDIFF(day,t1.maxDate,'2020-2-20')+1 '库龄',
(t1.totalNum - t2.totalNum) '库存'
from (select 商品编号,max(出入库日期) maxDate,sum(库存) totalNum from 出入库表 where 出入库标识='入库' and DATEDIFF(day,出入库日期,'2020-2-20')>=0 group by 商品编号) t1
left join (select 商品编号,sum(库存)totalNum from 出入库表 where 出入库标识='出库' and DATEDIFF(day,出入库日期,'2020-2-20')>=0 group by 商品编号) t2 on t1.商品编号=t2.商品编号

select distinct t1.商品编号,max(t2.日期)-min(t1.日期),sum(t1.数量)-sum(t2.数量)
fromselect * from 表名 where 出入库表='入库' )t1 left joinselect * from 表名 where 出入库表='出库)t2 on t1.商品编号=t2.商品编号

库龄的计算规则是怎样的

select 商品编号,
sum(case when 出入库表='入库' THEN 数量 else 0 end) as 入库,
sum(case when 出入库表='出库' THEN 数量 else 0 end)as 出库,
sum(case when 出入库表='入库' THEN 数量 else 0 end)-sum(case when 出入库表='出库' THEN 数量 else 0 end) as 库存,
datediff(max(出入库日期),min(出入库日期)) as 库龄 
FROM a where 出入库日期<='2020-2-20' group BY 商品编号

img

不知道你的库龄计算规则,所以就取了最大值和最小值相减了 ,除了这个规则,效果就是你要的效果了

sel server 的:

select [商品编号],
sum(case when [出入库表]='入库' THEN [数量] else 0 end)-sum(case when [出入库表]='出库' THEN [数量] else 0 end) as 库存,
datediff(day,min(出入库日期),max(出入库日期)) as 库龄 
FROM [a] group BY [商品编号]

img


加上分析:
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 的库龄就应该是 13,因为最后的库存里只有 2020-01-07 100 入库的,所以,库龄就只有13,在这个过程当中,可能不止2次入库和出库,甚至更多次,所以在回复里面才有最后那个语句,可以查看回复里的信息

【温馨提示:若能帮到您,望给个采纳该答案,谢谢!】
1、效果如下

img

2、代码如下

select a.shopid as 商品编号,
(datediff(day, a.minTimevalue, b.maxTimevalue) ) as 库龄,
(a.totalInValue-b.totalOutValue) as '库存'
from(
    --先按商品编号分组,并筛选入库值和统计入库总值
    --出库最小得时间
    select shopid,min(timevalue) as minTimevalue,
    sum(stockValue) as totalInValue
    from stock 
    where typeValue='入库' and timevalue<='2020-02-20'
    group by shopid
) as a
left join(
    --先按商品编号分组,并筛选出库值和统计入库总值
    --出库最大得时间
    select shopid,
    max(timevalue) as maxTimevalue,
    sum(stockValue) as totalOutValue
    from stock where typeValue='出库' and timevalue<='2020-02-20'
    group by shopid
) as b
on a.shopid=b.shopid

是这种效果吧

img


SELECT 入库.商品编号,DATEDIFF(DAY,入库.日期, 出库.日期) AS 库龄,入库.库存数-出库.出库数 AS 库存 FROM (

SELECT 商品编号,SUM(数量) 库存数,MIN(出入库日期) 日期 FROM #商品 WHERE 出入库表='入库' AND  出入库日期<'2020-2-20' GROUP BY 商品编号
) AS 入库

LEFT JOIN
(
SELECT 商品编号,SUM(数量) 出库数,MAX(出入库日期) 日期 FROM #商品 WHERE 出入库表='出库'  AND  出入库日期<'2020-2-20' GROUP BY 商品编号
) AS 出库

ON 出库.商品编号 = 入库.商品编号

给日期建立索引,用下面的代码


declare @dt datetime
set @dt='2020-1-30'

declare @t1 table ( pid char(18),datetime datetime, amount int)
insert @t1 select '123', '2020-01-01', 1000
union select '234', '2020-01-01', 1000
union select '123', '2020-01-15', 1000
union select '234', '2020-01-15', 1000
union select '123', '2020-01-17', 1000
union select '234', '2020-01-17', 1000
union select '123', '2020-01-19', 1000
union select '234', '2020-01-19', 1000

declare @t2 table ( pid char(18),datetime datetime, amount int)
insert @t2 select '123', '2020-01-01', 50
union select '123', '2020-01-02', 50
union select '123', '2020-01-05', 50
union select '234', '2020-01-01', 50
union select '234', '2020-01-02', 50
union select '234', '2020-01-05', 50
union select '123', '2020-01-16', 2000
union select '234', '2020-01-16', 2000

select t1.pid,(t1.totalNum - t2.totalNum) '库存',(SELECT TOP 1 DATEDIFF(day,a.datetime,@dt)+1 FROM (select * from @t1 where pid=t1.pid) a

LEFT JOIN (select * from @t1 where pid=t1.pid) b ON a.pid = b.pid

WHERE a.datetime<=@dt AND b.datetime<=@dt and a.datetime>=b.datetime GROUP BY a.datetime HAVING SUM(b.amount)>t2.totalNum ORDER BY a.datetime asc) '库龄'

from (select pid,max(datetime) maxDate,sum(amount) totalNum from @t1 where datetime<=@dt group by pid) t1

left join (select pid,sum(amount)totalNum from @t2 where datetime<=@dt group by pid) t2 on t1.pid=t2.pid