2015-04-17 4 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 

Проблема: строки присоединился дублируется в то время как я должен сделать некоторые аналитики: Сумм все сумма депозита - вы можете увидеть мой обходной путь здесь для 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».

Одно из ограничений здесь, я боюсь, я не могу использовать «left join (SELECT ... FROM deposit) как депозит», потому что он занимает много памяти, получая все строки вкладов из таблицы депозитов.

Здесь я нашел интересный ответ Sum values from one column if Index column is distinct? Но это для MSSQL.

Итак, вопрос: есть ли способ суммировать все первые депозиты, не используя JOIN (SELECT), или, может быть, есть способ с JOIN (SELECT), но с некоторым трюком экономики?

ОБНОВЛЕНИЕ. Мы также можем использовать deposit.account_id, который является отношением к таблице счетов.

+0

может отправить результат набора текущего запроса? – Avidos

+0

... депозит записи customer_id, а не account_id? –

+0

и будет ли у пользователя несколько учетных записей? –

ответ

0

Этот запрос предоставит вам customer_id и amount для их первого депозита без использования подзапроса.

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

Мне нужно знать больше о взаимосвязи между таблицами, прежде чем я могу включить в таблицу таблицу 'account'. в частности, если пользователь может иметь более одной учетной записи. если они могут, депозит должен быть действительно записан на счет, а не на клиента, иначе это станет .. болезненным –

+0

Спасибо! К этой проблеме относится подключение к аккаунту account_id. –

+0

ах удивительный. Да, это всегда было трудно с депозита, для клиента, для учета. –

Смежные вопросы