2014-01-13 42 views
0

我有兩個主要表格票據和billing_items:MySQL的獨特之和不子查詢

bills 
_______ 
id 
.. 
amount 
balance 

billing_items 
______________ 
id 
... 
bill_id 

我需要基於billing_items表一定的標準(表引用其他表拿到賬單金額和餘額的總和利息)

當我使用下面的查詢,我得到重複:

select sum(b.amount), sum(b.balance) 
from bills b left join billing_items bi 
on b.id=bi.bill_id; 

我不能使用子查詢,如下面的一個,因爲我使用的ORM的(子查詢不支持):

select sum(a) from 
(select b.amount as a, b.balance 
    from bills b left join billing_items bi 
    on b.id=bi.bill_id group by b.id) t; 

上billing_items標準及其引用表是中省略,但是我需要引用billing_items

+1

考慮提供適當的DDL和/或sqlfiddle與期望的結果集 – Strawberry

+0

那麼第一個查詢有什麼問題?你能解釋一下「某些標準」嗎(因爲你的查詢中沒有任何過濾器)。如果你能用簡單的語言解釋你想要的結果是什麼樣的話,我認爲這會非常有幫助。 –

+0

我會加入billing_items與其他3個表(visitprocedure - > visit - > referrer - > company)。我需要過濾company.id – user979051

回答

1

不知道,如果你的ORM允許使用用戶變量或不在您的SQL,如果是的話,你可以試試這個,基本上是ORDER BY bi.bill_id只有款額時,有一個新的bill_id

select sum(IF (@prevBillId IS NULL OR @prevBillId != bi.bill_id,b.amount,0)) as sumAmount, 
     sum(IF (@prevBillId IS NULL OR @prevBillId != bi.bill_id,b.balance,0)) as sumBalance, 
     @prevBillId:=bi.bill_id 
from bills b left join billing_items bi 
on b.id=bi.bill_id 
ORDER BY bi.bill_id; 

看到這個sqlFiddle

+0

ORM不會但這是一個很好的解決方案。不幸的是我不能使用它 – user979051

+0

你的ORM是否允許你使用NOT EXIST(從某些where SELECT somecolumn = somevalue中選擇)? –

0

希望這將工作...

所以你的問題是你的左邊加盟billing_items會導致每個結算項目出現多行,並且您的總金額(b.amount)將乘以您擁有的行數。所以解決辦法...把你的總數除以你的數。

select b.id,sum(b.amount)/count(*) as amount, sum(b.balance) 
from bills b left join billing_items bi 
on b.id=bi.bill_id; 
group by b.id 

給一個嘗試......希望它能解決問題。

+0

我喜歡這個主意,但它無法正常工作。每個賬單的金額再次被添加到每個特定賬單中的每個賬單項目 – user979051

+0

您正在求和的金額在賬單表中是否正確?當您加入billing_items時,只需爲每個結算項目(或每行)重複該賬單的金額。不知道我是否明白爲什麼它不能工作。如果10'000重複次數,它總和爲40000,除以4則返回到你想要的10'000數字。也許我不明白你在這裏總結的是什麼 – Twelfth

+0

((100 + 100 + 100)/ 3))+((200 + 200 + 200 + 200)/ 4)= 1100/7 – user979051