SQL-购进库存记录

题目
有如下2张表

  • F0128A发药信息表
    在这里插入图片描述

  • F0128B购进记录表
    在这里插入图片描述
    某医院系统卖给患者阿莫西林X数量后去下购进记录的库存,购进记录可能是零散的。现在按iilszh排序,优先iilszh小的,依次下库存如何得到类似下面的结果集:
    在这里插入图片描述
    测试语句

CREATE TABLE F0128A (
-- iilszh INT IDENTITY(1,1) -- SQL server
iilszh INT AUTO_INCREMENT -- MySQL
,spmc VARCHAR(100) --药品名称
,fysl NUMERIC(18,4) --发药数量
)
INSERT INTO F0128A (spmc, fysl) VALUES ('阿莫西林胶囊',80);
INSERT INTO F0128A (spmc, fysl) VALUES ('人血白蛋白',100);


CREATE TABLE F0128B (
-- iilszh INT IDENTITY(1,1) -- SQL server
iilszh INT AUTO_INCREMENT -- MySQL
,spmc VARCHAR(100) --药品名称
,gjsl NUMERIC(18,4) --购进数量
)
INSERT INTO F0128B (spmc, gjsl) VALUES ('阿莫西林胶囊',20);
INSERT INTO F0128B (spmc, gjsl) VALUES ('阿莫西林胶囊',50);
INSERT INTO F0128B (spmc, gjsl) VALUES ('阿莫西林胶囊',40);
INSERT INTO F0128B (spmc, gjsl) VALUES ('阿莫西林胶囊',30);
INSERT INTO F0128B (spmc, gjsl) VALUES ('人血白蛋白',120);
INSERT INTO F0128B (spmc, gjsl) VALUES ('人血白蛋白',80);
INSERT INTO F0128B (spmc, gjsl) VALUES ('人血白蛋白',100);

解法

SELECT 
spmc AS 药品名称, 
gjsl AS 购进数量, 
(gjsl - (CASE
WHEN diff_sl < 0 THEN 0 
WHEN diff_sl > gjsl THEN gjsl
ELSE diff_sl END)) AS 本次库存数量, 
CASE
	WHEN diff_sl < 0 THEN 0 
	WHEN diff_sl > gjsl THEN gjsl
	ELSE diff_sl END 剩余数量 
FROM(
	SELECT *,(cum_gjsl - fysl) AS diff_sl 
	FROM (
		SELECT a.*,b.fysl FROM(
			SELECT *, 
			SUM(gjsl) OVER (PARTITION BY spmc ORDER BY iilszh) AS cum_gjsl 
			FROM f0128b 
			ORDER BY iilszh ) a
		JOIN (SELECT spmc, fysl FROM f0128a) b
		ON a.spmc = b.spmc) c
	ORDER BY iilszh, diff_sl) d
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值