0

嗨,我是 SQL 的初学者,遇到了问题。

我有以下 5 个表:

分公司(姓名、城市)、 员工(员工编号、姓名、分公司)、 客户(客户编号 、姓名、员工编号)、帐户详细信息(帐户编号、客户编号)、 帐户(帐户编号、余额)

员工通过 Employee Branch 属性加入到单个 Branch。客户通过 EmpNo 属性连接到单个 Employee。

每个客户可以有多个帐户,每个帐户可以有多个客户(因此允许共享帐户) - 因此我创建了一个交叉实体(AccountDetails)。

我想对每个分行的总余额求和 - 我得到的问题是我的总数是重复计算的,即由于许多客户可以共享一个帐户,我的代码将计算每个客户帐户,即使它指的是相同的 AccNo - 所以AccNo 和随附的余额会反复计算,具体取决于有多少客户共享一个帐户,因此如果 2 个客户共享一个帐户,则余额将被计算两次。

select sum(a.balance), a.accno, b.name
from branch b, bankemployee e, customer c, accountdetails d, account a
where b.name = e.branch
and e.empno = c.empno
and c.custno = d.custno
and d.accno = a.accno
group by a.accno, b.name

我使用了 DISTINCT egdaccno IN(从 accountDetails 中选择不同的 accno),但无济于事,它仍然是双重计数。

我在 Account 表中放置了一个 Branch 属性,但如果可能的话,我不想这样做。

任何帮助是极大的赞赏。

谢谢你。

4

1 回答 1

1

试试这个。它使用子查询为每个帐户仅获取一个客户的信息。这并不理想,但根据您的数据库结构,它应该可以工作:

select sum(accts.balance), accts.accno, b.name
from branch b inner join bankemployee e on b.name = e.branch
inner join customer c on e.empno = c.empno
inner join (select a.accno, a.balance, max(b.custno) as custMax from account as a
inner join accountdetails as b on a.accno=b.accno
 group by a.accno,a.balance) as accts on c.custno=accts.custMax
group by accts.accno, b.name
于 2013-04-30T13:46:40.227 回答