说明:有三个表,项目表、合同表、付款表。下面是建表的语句:create table 项目 (项目编号 int,项目名称 varchar(50))
insert into 项目
select 1,'项目1' from dual
union all
select 2,'项目2' from dual
union all
select 3,'项目3' from dual;create table 合同(合同编号 int,项目编号 int,合同金额 number(7,3))
insert into 合同
select 1,1,1000 from dual
union all
select 2,1,1500 from dual
union all
select 3,2,2000 from dual;create table 付款(付款编号 int ,合同编号 int,付款金额 number(7,3))
insert into 付款
select 1,1,100 from dual
union all
select 2,2,200 from dual
union all
select 3,2,800 from dual;
设计一个查询语句,检索的格式如下:----------------------------------------------------------------------
项目编号    项目名称    项目所有合同的金额    项目所有合同已付款金额   
1           项目1       2500.000              11000.000
2           项目2       2000.000              null
----------------------------------------------------------------------我给出的答案
select a.项目编号,a.项目名称,sum(b.合同金额)项目所有合同的金额,sum(c.付款金额)项目所有合同已付款金额
from 项目 a left join 合同 b on a.项目编号 = b.项目编号 left join 付款 c on b.合同编号 = c.合同编号
where b.合同金额 >0
group by a.项目编号,a.项目名称出现的结果:
1 项目1 4000 1100
2 项目2 2000
谁能告诉我那儿错了,并给出正确答案!
我在耐心等待!

解决方案 »

  1.   

    你先要b和C外联,然后group by
    再和a 联,否则做出来的合同金额会多加的
    主要是合同编号为2那条,你付款有两条
    你直接这样做
    会多一条合同金额为1500的
      

  2.   

    select a.项目编号,a.项目名称,sum(d.合同金额)项目所有合同的金额,sum(d.付款金额)项目所有合同已付款金额
        from a,
         (
         select  b.项目编号 ,b.合同编号,b.合同金额,sum(c.付款金额) 付款金额 
          from b,c
          where b.合同编号 = c.合同编号(+)
          group by b.项目编号 ,b.合同编号,b.合同金额
         ) d
    where a.项目编号 = b.项目编号(+)
      

  3.   

    一对多连接表后,SUM后会重复加几遍值。写成子查询的方式或者用sum(DISTINCT d.合同金额)试试看。
      

  4.   


    谢谢啊,用distinct很好,很有用,谢谢啊!
      

  5.   

    咋看你的这SQL语句好复杂啊!