Запрос MySQL: суммировать значения столбца с разными значениями для другого столбца

Я пытаюсь построить запрос MySQL с несколькими соединениями с суммой объединенных значений. Есть 3 таблицы: клиент, счет и депозит. Аккаунт и депозит присоединяются к клиенту по их полю customer_id. В конце запроса все клиенты группируются по их group_id:

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».

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

Я видел здесь интересный ответ Суммировать значения из одного столбца, если Столбец индекса отличается? Но это для MSSQL.

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

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


person Pavel Bariev    schedule 17.04.2015    source источник
comment
может опубликовать набор результатов текущего запроса?   -  person Avidos    schedule 17.04.2015
comment
... депозит записывает customer_id, а не account_id ?   -  person pala_    schedule 17.04.2015
comment
и будет ли у пользователя более одной учетной записи?   -  person pala_    schedule 17.04.2015
comment
pala_ Да, мы также можем присоединиться к депозитам по их account_id, и да, у пользователя много аккаунтов.   -  person Pavel Bariev    schedule 17.04.2015


Ответы (1)


Этот запрос даст вам 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
person pala_    schedule 17.04.2015
comment
мне нужно узнать больше об отношениях между таблицами, прежде чем я смогу включить таблицу account в ответ. в частности, если пользователь может иметь более одной учетной записи. если они могут, депозит действительно должен быть записан на счет, а не на клиента, иначе это становится.. болезненным - person pala_; 17.04.2015
comment
Спасибо! Присоединение по account_id было ключом к этой проблеме. - person Pavel Bariev; 17.04.2015
comment
ах круто. да, всегда было тяжело переходить от депозита к клиенту, к счету. - person pala_; 17.04.2015