求货物分配的练习

本文提供了一个具体的SQL查询案例,展示了如何从两个表中查询特定的数据并进行聚合计算。通过两个表TBA和TBB的数据关联,实现了对不同时间点的物品名称、数量及已分配量的精确查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预备数据:


--生成测试数据
drop table TBA,TBB
create table TBA(名称 varchar(10),数量 int,时间 varchar(10))
insert into TBA values('a',2,20071011)

insert into TBA values('a',1,20071012)
insert into TBA values('a',3,20071013)

insert into TBA values('b',2,20071011)
insert into TBA values('b',1,20071012)
insert into TBA values('b',3,20071013)

create table TBB(名称 varchar(10),数量 int)
insert into TBB values('a',3)
insert into TBB values('a',1)
insert into TBB values('b',6)


希望看见的查询结果:

/**
名称 数量 时间 名称 已分配量
a 2 20071011 a 2
a 1 20071012 a 1
a 3 20071013 a 1
b 2 20071011 b 2
b 1 20071012 b 1
b 3 20071013 b 3
*/



答案:

------------测试语句
SELECT 名称, SUM(数量) from TBA WHERE TBA.时间<20071013 AND TBA.名称='a' GROUP BY TBA.名称

-----------解答一

SELECT A.*,C.名称,C.总数,已分配量 =
CASE WHEN (C.总数-ISNULL(( SELECT SUM(D.数量)
FROM TBA AS D
WHERE D.时间<A.时间
AND D.名称=A.名称
GROUP BY D.名称),0))>=A.数量
THEN
A.数量
ELSE
(C.总数-ISNULL(( SELECT SUM(D.数量)
FROM TBA AS D
WHERE D.时间<A.时间
AND D.名称=A.名称
GROUP BY D.名称),0))
END
FROM TBA AS A
left JOIN
( SELECT B.名称 AS 名称,SUM(B.数量) AS 总数
FROM TBB B
GROUP BY B.名称) AS C
ON ( A.名称=C.名称)


-----------解答二

SELECT TBA.*,TBB.数量-ISNULL((
SELECT SUM(数量)
FROM TBA A
WHERE A.名称 = TBA.名称
AND A.时间< TBA.时间) ,0),
ISNULL(( SELECT SUM(数量)
FROM TBA A
WHERE A.名称 = TBA.名称
AND A.时间< TBA.时间) ,0)
as FCQ,TBB.数量
FROM TBA
LEFT OUTER JOIN
( SELECT 名称,SUM(数量) AS 数量
FROM TBB
GROUP BY 名称 ) AS TBB
ON TBA.名称=TBB.名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值