首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > IBM DB2 >

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

2012-02-19 
高手帮忙,求一select语句A表是主表,cd是主键cdname1AA2BBB表是从表,两个主键,cd,idcdidmoney1110012200133

高手帮忙,求一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


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

热点排行