2013-04-30 105 views
0

嗨,我是一個初學SQL並有問題。SQL多表加入SUM

我有以下5個表:

(名稱,市), 員工(EMPNO,名稱,分公司), 客戶(CustNo,名稱,EMPNO), AccountDetails(ACCNO,CustNo) 帳戶(ACCNO,平衡)

僱員連接到一個單一的通過員工分支屬性進行分支。 客戶通過EmpNo屬性加入到單個員工。

每個客戶可以有多個帳戶,每個帳戶可以有幾個客戶(所以允許共享帳戶) - 因此我做了一個交集實體(AccountDetails)。

我想總結每個分支的總餘額 - 我得到的問題是我的總數是雙重計數,即許多客戶可以共享一個帳戶我的代碼將統計每個客戶帳戶,即使它指的是相同的AccNo - 所以AccNo和伴隨的餘額會一遍又一遍地計算,具體取決於有多少客戶共享一個賬戶,所以如果兩個客戶共享一個賬戶,那麼餘額將被計算兩次。

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)但無濟於事,它仍然是雙重計數。

我在帳戶表中放了一個分支屬性,但我不想這樣做,如果可能的話。

任何幫助,非常感謝。

謝謝。

+0

你爲什麼要加入到客戶,accountdetails和bankemployee完全?你似乎沒有使用它們的列。 – Aushin 2013-04-30 13:40:23

+1

當多個客戶共享一個擁有不同分支機構員工的賬戶時,應該做什麼?您的數據模型存在一些問題。值得注意的是,客戶直接與銀行員工聯繫似乎很奇怪。 – 2013-04-30 13:58:26

+0

@Aushin你能說一說你的意思嗎?謝謝 – monster 2013-04-30 14:25:21

回答

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 
+0

+1。 。 。我不是特別喜歡這個解決方案,但它似乎是關於這個數據模型的最佳選擇。 – 2013-04-30 14:25:13

+0

@jle我會盡快解決這個問題,謝謝! – monster 2013-04-30 14:29:44

+0

@jle我使用了不同風格的語法,所以無法完全轉換它。你能解釋max(b.custno)背後的原因嗎?謝謝 – monster 2013-04-30 15:11:16