2015-04-17 53 views
0

我試圖建立MySQL查詢與多個連接蒙山加盟值的總和。有3個表格:custmer,帳戶和存款。帳戶和存款將通過其customer_id字段加入到客戶中。在查詢結束時,所有的客戶都被他們GROUP_ID分組:MySQL查詢:和列值具有鮮明的另一列

SELECT customer.*, 
COUNT(DISTINCT account.id) as account_count, 
SUM(deposit.amount)/(COUNT(deposit.id)/COUNT(DISTINCT deposit.id)) as deposit_sum, 
SUM(???) as deposit_first_sum 
FROM customer 
    LEFT JOIN account ON account.customer_id = customer.id 
    LEFT JOIN deposit ON deposit.customer_id = customer.id 
GROUP BY customer.group_id 

的問題是:加入了行被複制,而我不得不做出一些分析:SUMM所有存款金額 - 你可以在這裏看到我的解決辦法爲deposit_sum。但真正的問題是總結「客戶的首次存款」。分組結果之前,我們可能會看到有這樣的:

... deposit.id deposit.customer_id deposit.amount 
...  1    1    10 
...  2    1    20 
...  3    2    15 
...  4    2    30 

所以我需要的是總結僅第一量爲每CUSTOMER_ID(10 + 15),這將是「deposit_first_sum」。這裏

一個限制是我很害怕,因爲它需要大量的內存,同時從存款表讓所有存款行,我不能用「左連接(SELECT ... FROM存款)作爲定金」。

我在這裏看到了一個有趣的答案Sum values from one column if Index column is distinct? 但它適用於MSSQL。

所以,問題是:有沒有辦法來概括所有的第一存款,而無需使用JOIN(SELECT)或可能存在與JOIN(SELECT)的方式,但有些記憶經濟把戲?

UPDATE。 我們也可能使用與帳戶表相關的deposit.account_id。

+0

可以發佈當前查詢的結果集? – Avidos

+0

...存款記錄customer_id而不是account_id? –

+0

並且用戶會擁有多個帳戶? –

回答

0

此查詢將爲您提供customer_idamount首次存款,而無需使用子查詢。

select d1.customer_id, d1.amount 
    from deposit d1 
    left join deposit d2 
     on d1.customer_id = d2.customer_id and d1.id > d2.id 
    where d2.id is null; 

很明顯,你可以得到sum還有:

select sum(d1.amount) total_first_deposit 
    from deposit d1 
    left join deposit d2 
     on d1.customer_id = d2.customer_id and d1.id > d2.id 
    where d2.id is null; 

您還可以得到總和,以及第一存款這樣的總和:

select sum(d3.amount) total_deposit, sum(case when d3.id = d1.id then d3.amount end) total_first_deposit 
    from deposit d1 
    left join deposit d2 
     on d1.customer_id = d2.customer_id and d1.id > d2.id 
    inner join deposit d3 
     on d1.customer_id = d3.customer_id and d2.id is null 
+0

我需要更多地瞭解表格之間的關係,然後才能在答案中包含「帳戶」表。具體來說,如果用戶可以有多個帳戶。如果可以的話,真正的存款應該記錄在賬戶上,而不是客戶,否則這會變成..痛苦的 –

+0

謝謝!通過account_id加入是這個問題的關鍵。 –

+0

啊真棒。是的,從存款,客戶到賬戶總是很難。 –