SQL语句

navy887 2012-01-11 03:59:11
希望用SQL语句或存储过程实现下边功能:

A表(销售表)
商品名 购买数量
商品A 50
商品B 30

B表(库存表)
商品名 仓库 库存
商品A 上海 40
商品A 北京 40
商品B 上海 40
商品B 北京 40
................

想得到结果:
商品名 提货仓库 数量
商品A 上海 40
商品A 北京 10
商品B 上海 30


--测试数据
create table AAA(
Productname varchar(16),
number int
)

create table BBB(
Productname varchar(16),
area varchar(32),
number int
)

insert into AAA values('商品A',50),('商品B',30)
insert into BBB values('商品A','上海',40),('商品B','上海',40),('商品A','北京',40),('商品B','北京',40)

select * from AAA
select * from BBB
...全文
328 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
navy887 2012-01-12
  • 打赏
  • 举报
回复
这个还是有问题,继续求解
百年树人 2012-01-12
  • 打赏
  • 举报
回复
写一个,效率可能会很差,先看看
create table AAA(
Productname varchar(16),
number int
)

create table BBB(
Productname varchar(16),
area varchar(32),
number int
)

insert into AAA values('商品A',50)
insert into AAA values('商品B',30)
insert into BBB values('商品A','上海',40)
insert into BBB values('商品B','上海',40)
insert into BBB values('商品A','北京',40)
insert into BBB values('商品B','北京',40)
insert into BBB values('商品A','四川',40)
insert into BBB values('商品B','四川',40)

--select * from AAA
--select * from BBB

;with t1 as(
select *,id=row_number() over(partition by [Productname] order by [area]) from bbb
),
t2 as(
select *,num=(select sum(number) from t1 where productname=t.productname and id<=t.id) from t1 t
)
select a.productname as 商品名,b.area as 提货仓库,
数量=case when b.num<a.number then b.number else
case when a.number-isnull((select top 1 num from t2 where productname=b.productname and id<b.id order by id desc),0)>0
then isnull(a.number-(select top 1 num from t2 where productname=b.productname and id<b.id order by id desc),a.number) else 0 end
end
from aaa a
join t2 b on a.productname=b.productname

/**
商品名 提货仓库 数量
---------------- -------------------------------- -----------
商品A 北京 40
商品A 上海 10
商品A 四川 0
商品B 北京 30
商品B 上海 0
商品B 四川 0

(6 行受影响)
**/
wejill 2012-01-12
  • 打赏
  • 举报
回复
出库结果
SELECT PRODUCTNAME,area,SF__NUMBER FROM BBB where SF__NUMBER<>0
wejill 2012-01-12
  • 打赏
  • 举报
回复
WHERE NUMBER=变量 是根据 CCC 表来循环
目的是为了,让你自由选择优先发货的地点
wejill 2012-01-12
  • 打赏
  • 举报
回复
--测试数据
CREATE TABLE AAA(
PRODUCTNAME VARCHAR(16),
NUMBER INT,
SUM_NUMBER INT
)

CREATE TABLE BBB(
PRODUCTNAME VARCHAR(16),
AREA VARCHAR(32),
NUMBER INT,
IN_NUMBER INT,
NEXTOUT_NUMBER INT,
C__NUMBER INT,
SF__NUMBER INT
)
CREATE TABLE CCC(
AREA VARCHAR(32),
NUMBER INT,
)


INSERT INTO AAA(PRODUCTNAME,NUMBER) VALUES('商品A',121) INSERT INTO AAA(PRODUCTNAME,NUMBER) VALUES('商品B',78)
INSERT INTO BBB(PRODUCTNAME,AREA,NUMBER) VALUES('商品A','上海',40)
INSERT INTO BBB(PRODUCTNAME,AREA,NUMBER) VALUES('商品B','上海',40)
INSERT INTO BBB(PRODUCTNAME,AREA,NUMBER) VALUES('商品A','北京',40)
INSERT INTO BBB(PRODUCTNAME,AREA,NUMBER) VALUES('商品B','北京',40)
INSERT INTO BBB(PRODUCTNAME,AREA,NUMBER) VALUES('商品A','广州',40)
INSERT INTO BBB(PRODUCTNAME,AREA,NUMBER) VALUES('商品B','广州',40)
INSERT INTO BBB(PRODUCTNAME,AREA,NUMBER) VALUES('商品A','南京',40)
INSERT INTO BBB(PRODUCTNAME,AREA,NUMBER) VALUES('商品B','南京',40)

INSERT INTO CCC(AREA,NUMBER) VALUES('上海',1)
INSERT INTO CCC(AREA,NUMBER) VALUES('北京',2)
INSERT INTO CCC(AREA,NUMBER) VALUES('广州',3)
INSERT INTO CCC(AREA,NUMBER) VALUES('南京',4)


-- DROP TABLE AAA,BBB,CCC
SELECT * FROM AAA ; SELECT * FROM BBB ;SELECT * FROM CCC
SELECT PRODUCTNAME,SUM(SF__NUMBER) FROM BBB GROUP BY PRODUCTNAME

--初始循环数据
UPDATE AAA SET SUM_NUMBER=NUMBER
UPDATE BBB SET NEXTOUT_NUMBER=0,IN_NUMBER=0,C__NUMBER=0,SF__NUMBER=0

---------------------------------------------------循环开始,以表CCC 顺序循环 WHERE NUMBER=@变量
--更新本步骤发货要多少货
UPDATE A SET A.IN_NUMBER=B.SUM_NUMBER,A.C__NUMBER=A.NUMBER-B.SUM_NUMBER FROM BBB AS A,AAA AS B WHERE A.PRODUCTNAME=B.PRODUCTNAME AND A.AREA=(SELECT AREA FROM CCC WHERE NUMBER=1) AND B.SUM_NUMBER>0
--更新1步骤后,还有多少货要发,与实发数
UPDATE BBB SET SF__NUMBER=IN_NUMBER WHERE C__NUMBER>=0 AND AREA=(SELECT AREA FROM CCC WHERE NUMBER=1)
UPDATE BBB SET SF__NUMBER=NUMBER,NEXTOUT_NUMBER=C__NUMBER*-1 WHERE C__NUMBER<0 AND AREA=(SELECT AREA FROM CCC WHERE NUMBER=1)
--更新发货后,有多少货待发,转下循环
UPDATE AAA SET SUM_NUMBER=0
UPDATE A SET A.SUM_NUMBER=B.NEXTOUT_NUMBER FROM AAA AS A,BBB AS B WHERE A.PRODUCTNAME=B.PRODUCTNAME AND B.AREA=(SELECT AREA FROM CCC WHERE NUMBER=1)
-----------------------------------循环结束

SELECT '还有以下商品不够库存发货'
SELECT * FROM AAA WHERE SUM_NUMBER>0
黄_瓜 2012-01-11
  • 打赏
  • 举报
回复
;with t as(
select *,id=row_number() over(partition by [Productname] order by [area]) from bbb
)
,t2 as
(
select t.Productname,t.area,
case when aaa.number>t.number then t.number else aaa.number end as number
, aaa.number-t.number as n,1 as [Level]
from aaa,t where aaa.Productname=t.Productname and t.id=1
union all
select t.Productname,t.area,
case when t2.n>t.number then t2.n-t.number else t2.n end
, t2.n-t.number ,[Level]=[Level]+1
from aaa a,t,t2 where a.Productname=t.Productname and t.Productname=t2.Productname and t2.n>0 and t.id=[Level]+1
)
select Productname,area,number from t2
order by Productname,area

/*
Productname area number
---------------- -------------------------------- -----------
商品A 北京 40
商品A 上海 10
商品B 北京 30
*/


再试试 呵呵
navy887 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 beirut 的回复:]
你在测试一下。[/Quote]
这个也有问题,但没找到问题在哪。
数据变化查询结果就会出错了。

比如说增加2条记录:
insert into BBB values ('商品A','四川',40),('商品B','四川',40)
勿勿 2012-01-11
  • 打赏
  • 举报
回复
晕,散了一次步 不是一路人 算了

[Quote=引用 12 楼 beirut 的回复:]
引用 10 楼 szstephenzhou 的回复:

我觉得如果A商品他是可以取很多次的。最好是用程序写是比较好的。
他的所有用量是有累计的

必须要有来记录这个每次取的值和剩下的值
引用 7 楼 navy887 的回复:
没有取货优先级,随便取。

不过这个结果不是我想要的,我的商品B只需要30件,你这个结果里北京30+上海40,有70了。

谢谢!

哥你表白成功没……
[/Quote]
黄_瓜 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 szstephenzhou 的回复:]

我觉得如果A商品他是可以取很多次的。最好是用程序写是比较好的。
他的所有用量是有累计的

必须要有来记录这个每次取的值和剩下的值
引用 7 楼 navy887 的回复:
没有取货优先级,随便取。

不过这个结果不是我想要的,我的商品B只需要30件,你这个结果里北京30+上海40,有70了。

谢谢!
[/Quote]
哥你表白成功没
黄_瓜 2012-01-11
  • 打赏
  • 举报
回复
;with t as(
select *,id=row_number() over(partition by [Productname] order by [area]) from bbb
)
,t2 as
(
select t.Productname,t.area,
case when aaa.number>t.number then t.number else aaa.number end as number
from aaa,t where aaa.Productname=t.Productname and t.id=1
union all
select b.Productname,b.area,
case when a.number>b.number then a.number-b.number else '' end
from aaa a,t b where a.Productname=b.Productname and b.id>1
)
select * from t2 where number>0 order by Productname,area
/*
Productname area number
---------------- -------------------------------- -----------
商品A 北京 40
商品A 上海 10
商品B 北京 30
*/


你在测试一下。
勿勿 2012-01-11
  • 打赏
  • 举报
回复
我觉得如果A商品他是可以取很多次的。最好是用程序写是比较好的。
他的所有用量是有累计的

必须要有来记录这个每次取的值和剩下的值
[Quote=引用 7 楼 navy887 的回复:]
没有取货优先级,随便取。

不过这个结果不是我想要的,我的商品B只需要30件,你这个结果里北京30+上海40,有70了。

谢谢!
[/Quote]
黄_瓜 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 navy887 的回复:]

没有取货优先级,随便取。

不过这个结果不是我想要的,我的商品B只需要30件,你这个结果里北京30+上海40,有70了。

谢谢!
[/Quote]
囧,呵呵 我在改改。
勿勿 2012-01-11
  • 打赏
  • 举报
回复
好像不对吧

[Quote=引用 6 楼 beirut 的回复:]
SQL code
--测试数据
create table AAA(
Productname varchar(16),
number int
)

create table BBB(
Productname varchar(16),
area varchar(32),
number int
)

insert into AAA val……
[/Quote]
navy887 2012-01-11
  • 打赏
  • 举报
回复
没有取货优先级,随便取。

不过这个结果不是我想要的,我的商品B只需要30件,你这个结果里北京30+上海40,有70了。

谢谢!
黄_瓜 2012-01-11
  • 打赏
  • 举报
回复
--测试数据
create table AAA(
Productname varchar(16),
number int
)

create table BBB(
Productname varchar(16),
area varchar(32),
number int
)

insert into AAA values('商品A',50),('商品B',30)
insert into BBB values('商品A','上海',40),('商品B','上海',40),('商品A','北京',40),('商品B','北京',40)

select * from AAA
select * from bbb
;with t as(
select *,id=row_number() over(partition by [Productname] order by [area]) from bbb
)
,t2 as
(
select t.Productname,t.area,
case when aaa.number>t.number then t.number else aaa.number end as number
from aaa,t where aaa.Productname=t.Productname and t.id=1
union all
select b.Productname,b.area,
case when a.number>b.number then a.number-b.number else b.number end
from aaa a,t b where a.Productname=b.Productname and b.id>1
)
select * from t2 order by Productname,area
/*
Productname area number
---------------- -------------------------------- -----------
商品A 北京 40
商品A 上海 10
商品B 北京 30
商品B 上海 40

*/


这个按照地区排序取货,先取北京后上海,你看下,你们的应该有取货优先级的吧
勿勿 2012-01-11
  • 打赏
  • 举报
回复
最好是交给前台程序去处理会比较好。
navy887 2012-01-11
  • 打赏
  • 举报
回复
比如说商品A销售了50件需要发货,现在上海仓库有40件,北京仓库有40件。可以从上海仓提取25件,北京仓提取25件;或者上海仓提取40件,北京仓提取10件。只要凑够50件就可以。
黄_瓜 2012-01-11
  • 打赏
  • 举报
回复
在多弄点数据吧
navy887 2012-01-11
  • 打赏
  • 举报
回复
从仓库提取销售的商品,只要仓库有货,从哪个仓库提取都可以
勿勿 2012-01-11
  • 打赏
  • 举报
回复
说下规律

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧