(出入库表) (商品编号) (出入库日期) (数量)
入库 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.数量)
from (select * from 表名 where 出入库表='入库' )t1 left join (select * 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 商品编号
不知道你的库龄计算规则,所以就取了最大值和最小值相减了 ,除了这个规则,效果就是你要的效果了
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 [商品编号]
【温馨提示:若能帮到您,望给个采纳该答案,谢谢!】
1、效果如下
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
是这种效果吧
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