对我来说极难的一个SQL问题!
数据库中有三张表:销售表、退货表、利润调整表:
要求给出结算报表。
结算报表就是要求出已经结算的记录。但是要求很繁。
比如:
销售表中有记录:
ID GE1 GE2
1001 300 500
1002 500 700
1003 1000 800
退票表中有记录
ID GE1 GE2 N
1001 -300 -400 1//其中“1”表示在1001未结算的时候发生退货。
1002 -400 -400 0//其中“0”表示在1002已经结算的时候发生退货。
利润调整表中有记录:(其中1、0 和退票的时候一样处理)
ID GE1 GE2 N
1001 -30 -50 1
1002 -30 -60 0
要求结算报表时,如果退货记录字段为1那么和销售记录累加合并为一条记录。
1001 0 100
如果退货记录字段为0那么分开显示:
ID GE1 GE2
1002 500 700
1002 -400 -400
利润调整也一样,最后显示的就是
ID GE1 GE2
1001 -30 50
1002 500 700
1002 -400 -400
1002 -30 -60
1003 1000 800
这个sql怎么写呢?大家是否可以得出效率高的算法
问题点数:0、回复次数:7Top
1 楼happydreamer(www.sz.js.cn,www.gyxk.com)回复于 2003-02-04 17:38:27 得分 0
select a.ID,a.GE1,a.GE2
from
( select b.ID,b.GE1+c.GE1 as GE1,b.GE2+c.GE2 as GE2 from sale b inner join tui c on b.ID=c.ID where c.N=1
union
select b.ID,b.GE1 ,b.GE2 from sale b left join tui c on b.ID=c.ID where c.ID is null or c.N=0
union
select c.ID,c.GE1,c.GE2 from sale b right join tui c on b.ID=c.ID where c.N=0 or b.ID is NULL
)a
----------------------
ID GE1 GE2
1001 0 100
1002 -400 -400
1002 500 700
1003 1000 800
Top
2 楼czyoooo(按时)回复于 2003-02-04 20:01:46 得分 0
你这样只做到了两张表累加,事实情况比这个要复杂,
要求销售表分别和退货表、调整表比较,分析后面两张表的N字段。
如果为1,那么和销售记录中记录号相同的累加,为0单独出现在结算报表中。Top
3 楼czyoooo(按时)回复于 2003-02-04 20:06:05 得分 0
你写的只出现了两张表,调整表没有呀!Top
4 楼happydreamer(www.sz.js.cn,www.gyxk.com)回复于 2003-02-04 22:46:04 得分 0
try:
select a.ID,a.GE1,a.GE2
from
( select b.ID,b.GE1+c.GE1+d.GE1 as GE1,b.GE2+c.GE2+d.GE2 as GE2 from sale b inner join tui c on b.ID=c.ID
inner join profit d on b.ID=d.ID where c.N=1 and d.N=1
union
select b.ID,b.GE1 ,b.GE2 from sale b left join tui c on b.ID=c.ID where c.ID is null or c.N=0
union
select b.ID,b.GE1 ,b.GE2 from sale b left join profit d on b.ID=d.ID where d.ID is null or d.N=0
union
select c.ID,c.GE1,c.GE2 from sale b right join tui c on b.ID=c.ID where c.N=0 or b.ID is NULL
union
select d.ID,d.GE1,d.GE2 from profit d right join sale b on d.ID=b.ID where d.N=0 or b.ID is NULL
)a
-------------
1001 -30 50
1002 -400 -400
1002 -30 -60
1002 500 700
1003 1000 800
Top
5 楼rainxia(xiayu)回复于 2003-02-08 09:05:06 得分 0
兄弟用存储过程使用临时表Top
6 楼spring_ok(广州泰能软件)回复于 2003-02-08 09:20:43 得分 0
select A.ID, (A.GE1+B.GE1+C.GE1) as GE1, (A.GE2+B.GE2+C.GE2) as GE2
From A left join B on A.ID=B.ID And B.N=1
Left join C on A.ID = C.ID And C.N=1
union
(select ID, GE1, GE2 from B where B.N=0)
union
(select ID, GE1, GE2 from B where B.N=0)
Top
7 楼19191919(小楼别筑)回复于 2003-02-08 14:05:17 得分 0
从题目看,没看出有左连接关系,除非指明依据销售商品的情况,察看其退票或调整情况,不过即便指明,依我看退票id肯定会存在于销售中,所以我想可以不用做连接,直接将表union一下,就应该可以了吧
select id ,sum(ge1) as ge1,sum(ge2) as ge2 from
(select id,ge1,ge2 from a
union all
id,ge1,ge2 from b where n=1
union all
id,ge1,ge2 from c where n=1) as a
group by id
union all
(select ID, GE1, GE2 from B where n=0)
union all
(select ID, GE1, GE2 from c where n=0)
Top
相关问题
- 这个SQL怎么写,对我来说很难!
- 对我来说这是个高难度的sql查询语句
- 新手上路!请多关照!一个对我来说有点难的SQL语句问题!!!!!!!!!!!
- 请各位大哥帮忙写一个简单(对我来说难)的SQL语句!~
- 请教一个联查,求和的SQL语句,对我来说难,别别人来说可能很简单
- 极难的sql查询,有二年以上数据开发人员请进!!!!!!!!!!!
- 极难的sql查询,有二年以上数据开发人员请进!!!!!!!!!!!!!
- 一个极难的sql查询,难死办公室所有人~~~~~~~~在线等高手解答
- 对我来说具难的问题,从SQL SERVER库表中统计出数据把数据插入oracle的库表里~~~
- 写这样的SQL语句对我来说有难度,一句话也说不清楚,各位哥哥姐姐们进来看看吧




