ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 266|回复: 3

[已解决] sql 库龄计算问题 , 各路侠士练练手。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-30 11:52 | 显示全部楼层 |阅读模式
本帖最后由 abc123qqq 于 2024-6-30 17:19 编辑

sql 计算问题  
类似库龄计算。  依据先进先出, 列出 超期 的 入库 明细数据,也许有 超出两个批次的入库明细需要列出。 (不是计算最后一次入库的时间,即最大入库日期)。

建立表 :

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[stock](
        [typeValue] [varchar](50) NULL,
        [shopid] [int] NULL,
        [timevalue] [datetime] NULL,
        [stockValue] [int] NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO
image.png

加入数据:

insert into stock(typeValue,shopid,timevalue,stockValue)
values('入库',123,'2020-01-01',100)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('入库',234,'2020-01-02',100)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('出库',123,'2020-01-03',50)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('出库',234,'2020-01-04',50)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('出库',123,'2020-01-05',50)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('出库',234,'2020-01-06',50)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('入库',123,'2020-01-04',100)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('入库',123,'2020-01-08',100)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('入库',234,'2020-01-08',100)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('出库',123,'2020-01-09',30)
insert into stock(typeValue,shopid,timevalue,stockValue)
values('出库',234,'2020-01-10',30)


需求 :
取得  [dbo].[stock]   入库明细中,未被使用的批次的明细 ,  能计算出 剩余量  最好


image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-30 15:59 | 显示全部楼层
select * ,
isnull((select sum(stockvalue)
from
(select * from [dbo].[stock]  ) as da
    where  
  shopid = a.shopid and timevalue <= a.timevalue and typeValue like '入库'),0)   -
   isnull((select sum(stockvalue)
from
(select * from [dbo].[stock]  ) as da
    where  
  shopid = a.shopid and timevalue <= a.timevalue and typeValue like '出库'),0)   as  结余

FROM [dbo].[stock] a
where shopid like '123'
ORDER BY
a.timevalue ASC

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-30 18:08 | 显示全部楼层
再加个 库龄 计算的,做个记号


/*
编号123,还存在库存,则使用上次进货时间2020-01-11和2020-02-20相差,就是40天
编号234,还存在库存,则使用上次进货时间2020-01-11和2020-02-20相差,就是41天'
*/

declare @searchTime varchar(50)
set @searchTime='2020-02-20'

select a.shopid as 商品编号,
convert(varchar(10),a.inMaxTime,120) as 上次进货时间,
convert(varchar(10),b.outMaxTime,120) as 上次出货时间,

(case when (a.totalInValue-b.totalOutValue)>0
then datediff(day, a.inMaxTime, @searchTime) --还有库存,则用上次进货时间计算
else datediff(day, b.outMaxTime, @searchTime) end) as 库龄, --没有库存了,使用最后一次出库时间计算
(a.totalInValue-b.totalOutValue) as '库存',
(case when (a.totalInValue-b.totalOutValue)>0 then '还有库存' else '已出完' end) as 是否出库完
from(
    --先按商品编号分组,并筛选入库值和统计入库总值
    --出库最小得时间
    select shopid,
    min(timevalue) as inMinTime, --入库最小时间
    max(timevalue) as inMaxTime, --入库最大时间(上次进货时间)
    sum(stockValue) as totalInValue,
    count(1) as inCount
    from stock
    where typeValue='入库' and timevalue<=@searchTime
    group by shopid
) as a
left join(
    select shopid,
    min(timevalue) as outMinTime, --出库最小时间
    max(timevalue) as outMaxTime, --出库最大时间
    sum(stockValue) as totalOutValue  --出库总数
    from stock where typeValue='出库' and timevalue<=@searchTime
    group by shopid
) as b
on a.shopid=b.shopid

TA的精华主题

TA的得分主题

发表于 2024-6-30 20:57 | 显示全部楼层
mark一下,太难了。刚好也想学习这个。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 21:41 , Processed in 0.030020 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表