读书人

高手帮忙求一select语句,该怎么解决

发布时间: 2012-02-19 19:43:39 作者: rapoo

高手帮忙,求一select语句
A表是主表,cd是主键
cd name
1 AA
2 BB


B表是从表,两个主键,cd,id
cd id money
1 1 100
1 2 200
1 3 300
2 1 1000
2 2 2000
2 3 3000
2 4 4000
2 5 5000
2 6 6000

....


要求拣出来的结果是
cd money1 money2 money3 money4 money5
1 100 200 300
2 1000 2000 3000 4000 5000

就是把B表变成一个横表,而且只取B表的5条数据,不够5条补空格,超过5条截去

希望高手帮忙啊。分还可以再加,谢谢!

[解决办法]
create table a
(
cd int,
name char(8)
)
;

create table b
(
cd int,
id int,
money decimal(18,2)
)
;

insert into a values (1, 'AA '),(2, 'BB ');
insert into b values (1,1,100),(1,2,200),(1,3,300),(2,1,1000),(2,2,2000),(2,3,3000),(2,4,4000),(2,5,5000),(2,6,6000);

select a1.cd,(select money from b where a1.cd=b.cd and b.id=1),
(select COALESCE(money,0) from b where a1.cd=b.cd and b.id=2),
(select COALESCE(money,0) from b where a1.cd=b.cd and b.id=3),
(select COALESCE(money,0) from b where a1.cd=b.cd and b.id=4),
(select COALESCE(money,0) from b where a1.cd=b.cd and b.id=5)
from
(select distinct cd from b) as a1
order by cd
;

[解决办法]
这样写应该也可以,只是B表的ID列一定要从1开始递增排列

select cd, sum(m1) as money1 , sum(m2) as money2 ,sum(m3) as money3 ,sum(m4) as money4 ,sum(m5) as money5
from (
select cd ,money as m1, 0.00 as m2 ,0.00 as m3 ,0.00 as m4 , 0.00 as m5
from b where id = 1
union
select cd , 0.00 as m1, money as m2 ,0.00 as m3 ,0.00 as m4 , 0.00 as m5
from b where id = 2
union
select cd , 0.00 as m1, 0.00 as m2 ,money as m3 ,0.00 as m4 , 0.00 as m5
from b where id = 3
union
select cd , 0.00 as m1, 0.00 as m2 ,0.00 as m3 ,money as m4 , 0.00 as m5


from b where id = 4
union
select cd , 0.00 as m1, 0.00 as m2 ,0.00 as m3 ,0.00 as m4 , money as m5
from b where id = 5 ) as a

group by cd;
[解决办法]
select cd,
(select money from b where cd=a.cd and id=1),
(select money from b where cd=a.cd and id=2),
(select money from b where cd=a.cd and id=3),
(select money from b where cd=a.cd and id=4),
(select money from b where cd=a.cd and id=5)
from a
order by cd
;

[解决办法]
create table a ( cd int, name char(8));
create table b( cd int, id int, money decimal(18,2));
insert into a values (1, 'AA '),(2, 'BB '),(4, 'CC ');
insert into b values (1,1,100),(1,2,200),(1,3,300),(2,1,1000),(2,2,2000),(2,3,3000),(2,4,4000),(2,5,5000),(2,6,6000);

select a.CD,
sum((Case B.ID when 1 then B.Money else 0 end )) Money1,
sum((Case B.ID when 2 then B.Money else 0 end )) Money2,
sum((Case B.ID when 3 then B.Money else 0 end )) Money3,
sum((Case B.ID when 4 then B.Money else 0 end )) Money4,
sum((Case B.ID when 5 then B.Money else 0 end )) Money5
From a left join b
on a.CD=b.CD
Group by a.CD

CD NAME MONEY1 MONEY2 MONEY3 MONEY4 MONEY5
----- ------- --------- --------- --------- --------- ---------
1 AA 100.00 200.00 300.00 0.00 0.00
2 BB 1000.00 2000.00 3000.00 4000.00 5000.00
4 CC 0.00 0.00 0.00 0.00 0.00

3 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 94/ms]

[Executed: 07-3-9 下午11时13分13秒 ] [Execution: 78/ms]



[解决办法]
或者 楼主不是想要 a 表的全部,只是b 表的全部种类
select a.CD,
sum((Case B.ID when 1 then B.Money else 0 end )) Money1,
sum((Case B.ID when 2 then B.Money else 0 end )) Money2,
sum((Case B.ID when 3 then B.Money else 0 end )) Money3,
sum((Case B.ID when 4 then B.Money else 0 end )) Money4,
sum((Case B.ID when 5 then B.Money else 0 end )) Money5
From a , b
where a.CD=b.CD
Group by a.CD


经过验证,这种方式检索性能最好。。

读书人网 >IBM DB2

热点推荐