【问题标题】:SQL Multi-Table Join with SUM使用 SUM 进行 SQL 多表连接
【发布时间】:2013-04-30 13:32:05
【问题描述】:

您好,我是 SQL 初学者,但遇到了问题。

我有以下 5 个表:

分公司(名称、城市)、 员工(员工编号、姓名、分公司)、 客户(CustNo、姓名、EmpNo)、 AccountDetails(AccNo、CustNo)、 帐号(帐号、余额)

员工通过 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,例如d.accno IN(从 accountDetails 中选择不同的 accno)但无济于事,它仍然重复计算。

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

非常感谢任何帮助。

谢谢。

【问题讨论】:

  • 你为什么要加入客户、账户明细和银行员工?您似乎没有使用他们的列。
  • 而当多个客户共享一个帐户,而该帐户的员工在不同的分支机构,应该怎么办?您的数据模型存在一些问题。值得注意的是,客户直接附属于银行员工似乎很奇怪。
  • @Aushin 你能详细说明你的意思吗?谢谢
  • @GordonLinoff 我会说它的设计方式是客户必须在同一个分支机构才能拥有一个帐户,尽管没有指定。是的,将客户直接附加到银行员工而不是特定分行并没有多大意义,但遗憾的是,这不是我可以改变的,因为我被赋予了数据库的关系模式。感谢您的回复。

标签: sql join sum


【解决方案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

【讨论】:

  • +1 。 . .我不是特别喜欢这个解决方案,但它似乎是这个数据模型的最佳选择。
  • @jle 我使用了不同风格的语法,所以无法完全转换它。你能解释一下 max(b.custno) 背后的原因吗?谢谢
  • Max of customer number 将为每个帐号获得一个客户编号(对于您的目的而言,这并不重要)。
  • 仅供参考,内部连接相当于查询中的 where 子句
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多