已知两个表,求查询结果,为了描述清楚,我写多一点,请耐心看完。多谢!

[复制链接]
查看11 | 回复7 | 2015-9-25 14:27:26 | 显示全部楼层 |阅读模式
有个销售订单表(表名sale),如下
销售单据编号行号 物料名称 销售数量
S20160011
电脑 10

S20160012 复印机30

采购表结构(表名pur)
采购单据编号行号物料名称 采购数量原销售单据号原销售行号
sale和pur的关系为 pur.原销售单据号=sale.销售单据编号and pur.原销售行号=sale.行号

下面是几种要求的查询结果
1.没有采购的时候查询结果如下
物料名称 销售数量 采购数量 未采购数量
电脑
10
0
10
复印机
30
0
30

2.电脑采购10台
采购表结构(表名pur)
采购单据编号行号物料名称 采购数量原销售单据号原销售行号
P001
1电脑
10 S2016001
1
欲查询结果如下
物料名称 销售数量 采购数量 未采购数量
电脑
10
10
0
复印机
30
0 3

3.电脑有时候会多采购几次,比如这次再采购2台,采购表变成如下
采购单据编号行号物料名称 采购数量原销售单据号原销售行号
P001
1电脑
10S2016001 1
P002
1电脑
2 S2016001 1
查询结果要求
物料名称 销售数量 采购数量 未采购数量
电脑
10
10
0
电脑
0
2
-2
复印机
3
0
3
4.电脑再次采购9台,采购表变成如下,
采购单据编号行号物料名称 采购数量原销售单据号原销售行号
P001
1电脑
10S20160011
P002
1电脑
2 S2016001 1
P003
1电脑
9 S2016001 1
查询结果要求
物料名称 销售数量 采购数量 未采购数量
电脑
10
10
0
电脑
0
2
-2
电脑
-2
9
-11
复印机
3
0
3
5.电脑采购再次1台,打印机采购5台,采购表如下
采购单据编号行号物料名称 采购数量原销售单据号原销售行号
P001
1电脑
10S20160011
P002
1电脑
2 S20160011
P003
1电脑
9 S20160011
P004
1电脑
1 S20160011
P004
2复印机
5 S20160012
红色的这两行是同一个采购单号。
查询结果要求
物料名称 销售数量 采购数量 未采购数量
电脑
10
10
0
电脑
0
2
-2
电脑
-2
9
-11
电脑
-11 1
-12
复印机
3
5
-2
6.假如用户删除了第一张采购单P001
那么采购表变为
采购单据编号行号物料名称 采购数量原销售单据号原销售行号
P002
1电脑
2 S20160011
P003
1电脑
9 S20160011
P004
1电脑
1 S20160011
P004
2复印机
5 S20160012
查询结果要求
物料名称 销售数量 采购数量 未采购数量
电脑
10
2
8
电脑
8
9
-1
电脑
-1
1
-2
复印机
3
5
-2
以此类推,每个物料第一行未采购数量是第二行的销售数量。请大家给个解决方法

上面两表结构和数据在下面
if not object_id(N'Tempdb..sale') is nulldrop table sale
Create table sale(sbillno nvarchar(160),slineno int,wl_name nvarchar(260),fsale_qty decimal(23,10))
insert into sale
select 'S2016001',1,'电脑',10union all
select 'S2016001',2,'复印机',30

if not object_id(N'Tempdb..pur') is nulldrop table pur
Create table pur(Pbillno nvarchar(160),flineno int,wl_name nvarchar(260),fpur_qty decimal(23,10),sbillno nvarchar(160),slineno int)
Insert pur
select 'P001',1,'电脑',10,'S2016001',1 union all
select 'P002',1,'电脑',2,'S2016001',1 union all
select 'P003',1,'电脑',9,'S2016001',1 union all
select 'P004',1,'电脑',1,'S2016001',1 union all
select 'P004',2,'复印机',5,'S2016001',2
Go

回复

使用道具 举报

千问 | 2015-9-25 14:27:26 | 显示全部楼层
这个问题的思路是建一个存储过程,然后用游标一行一行的处理,将处理结果放到临时表里,最后再查询临时表。
还有问题你这个查询采购表里物料名称是一定能够在销售表里的物料名称里找到吗?
回复

使用道具 举报

千问 | 2015-9-25 14:27:26 | 显示全部楼层
佚名是译名 发表于 2016-9-8 14:59
这个问题的思路是建一个存储过程,然后用游标一行一行的处理,将处理结果放到临时表里,最后再查询临时表。 ...

物料名称,销售表和采购表是一样的。
回复

使用道具 举报

千问 | 2015-9-25 14:27:26 | 显示全部楼层
szminggong 发表于 2016-9-9 10:56
物料名称,销售表和采购表是一样的。

建一个存储过程处理吧,下去再看看
回复

使用道具 举报

千问 | 2015-9-25 14:27:26 | 显示全部楼层
create procedure sp_total as
begin
declare @nopur_qty decimal(23,10),@fsale_qty_t decimal(23,10),@sbillno nvarchar(160),@slineno int,@wl_name nvarchar(260)
declare @fsale_qty decimal(23,10),@fpur_qty decimal(23,10)
create table #t_total(wl_name nvarchar(260),fsale_qty int, fpur_qty int,nopur_qty int)
declare sale_cursor cursor local static for
select sbillno,slineno,wl_name,fsale_qty from sale
open sale_cursor
fetch sale_cursor into @sbillno,@slineno,@wl_name,@fsale_qty
while @@fetch_status = 0 begin

set @nopur_qty = @fsale_qty

set @fsale_qty_t = @fsale_qty

declare pur_cursor cursor local static for

select fpur_qty from pur where sbillno=@sbillno and slineno = @slineno and wl_name = @wl_name

open pur_cursor

fetch pur_cursor into @fpur_qty

while @@fetch_status = 0 begin

set @nopur_qty = @nopur_qty - @fpur_qty

insert into #t_total(wl_name,fsale_qty,fpur_qty,nopur_qty)

values (@wl_name,@fsale_qty_t,@fpur_qty,@nopur_qty)

set @fsale_qty_t = @nopur_qty

fetch pur_cursor into @fpur_qty

end

close pur_cursor

deallocate pur_cursor

fetch sale_cursor into @sbillno,@slineno,@wl_name,@fsale_qty
end
close sale_cursor
deallocate sale_cursor
select * from #t_total
end
按上面的创建一个存储过程,然后再用嵌套游标处理。
创建好了执行存储过程就好了
exec sp_total
回复

使用道具 举报

千问 | 2015-9-25 14:27:26 | 显示全部楼层
我测试下哈,好了就打赏。


回复

使用道具 举报

千问 | 2015-9-25 14:27:26 | 显示全部楼层
已打赏
回复

使用道具 举报

千问 | 2015-9-25 14:27:26 | 显示全部楼层
你这样写看起来好累,其它几个感觉都挺简单,
第6个:
以此类推,每个物料第一行未采购数量是第二行的销售数量。请大家给个解决方法
可以参考以下写法,简单效率高 
select * into #a from (
select *, ROW_NUMBER() over (orderby pbillno) as id from pur
)a
select * , isnull((select fpur_qty from #a b where a.id=b.id-1),0) as wcgsl from #a a
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行