问题四考核连接、分组统计、子查询的综合运用 此题得到了一些回帖基本如下:---------------------------------------------- select a.项目编号,a.项目名称,sum(合同金额) as 合同金额,sum(付款金额) as 付款金额 from 项目 a join 合同 b on a.项目编号=b.项目编号 left join 付款 c on b.合同编号=c.合同编号 group by a.项目编号,a.项目名称
一高手给出的正确答案是: select a.项目编号,a.项目名称,sum(distinct b.合同金额),sum(c.付款金额) from 项目 as a left join 合同 as b on a.项目编号=b.项目编号 left join 付款 as c on b.合同编号=c.合同编号 group by a.项目编号,a.项目名称
--这样楼主可能容易看懂一点:select a.项目编号,a.项目名称,合同金额=sum(b.合同金额),付款金额=sum(b.付款金额)
from 项目 a,
(select 项目编号,合同金额,付款金额=(selectsum(付款金额) from 付款 where 合同编号=a.合同编号) from 合同 a)b
where a.项目编号=b.项目编号
groupby a.项目编号,a.项目名称
一高手给出的正确答案是: select a.项目编号,a.项目名称,sum(distinct b.合同金额),sum(c.付款金额) from 项目 as a left join 合同 as b on a.项目编号=b.项目编号 left join 付款 as c on b.合同编号=c.合同编号 group by a.项目编号,a.项目名称 -------------------------------------------------------------------- 可以很负责的告诉你,高手给出的答案较前面给出的答案要正确些,但依然在某种巧合下产生错误。 这种巧合就是存在某个项目中有两个或多个合同的金额相同的情况下。 因此,正确的答案应该是:2楼的思路,下面的语句。
SQL code
select a.项目编号,a.项目名称,合同金额=sum(b.合同金额),付款金额=sum(b.付款金额)
from 项目 a leftjoin (select 项目编号,合同金额,付款金额=(selectsum(付款金额) from 付款 where 合同编号=a.合同编号) from 合同 a)b
on a.项目编号=b.项目编号
groupby a.项目编号,a.项目名称
select a.项目编号,a.项目名称,sum(distinct b.合同金额),sum(c.付款金额)
from 项目 as a
leftjoin 合同 as b on a.项目编号=b.项目编号
leftjoin 付款 as c on b.合同编号=c.合同编号
groupby a.项目编号,a.项目名称
然后我发现错了,出来的结果是对的,但只是巧合. 所以,我随即在13楼说到"不对" 然后写了:
SQL code
select a.项目编号,a.项目名称,
(selectsum(合同金额) from 合同 where 项目编号=a.项目编号) as 项目所有合同的金额,
(selectsum(付款金额) from 付款 as b innerjoin 合同 as c on b.合同编号=c.合同编号 where c.项目编号=a.项目编号) as 项目所有合同已付款金额
from 项目 as a
select a.项目编号,a.项目名称,sum(t.项目所有合同的金额) as 项目所有合同的金额,sum(t.项目所有合同已付款金额) as 项目所有合同已付款金额
from 项目 as a
leftjoin (
select b.项目编号,b.合同编号,max(b.合同金额) as 项目所有合同的金额,sum(c.付款金额) as 项目所有合同已付款金额
from 合同 as b
leftjoin 付款 as c on b.合同编号=c.合同编号
groupby b.项目编号,b.合同编号
) as t on a.项目编号=t.项目编号
groupby a.项目编号,a.项目名称