использование агрегатных функций перед объединением таблиц - PullRequest
2 голосов
/ 20 апреля 2019

У меня есть две таблицы и я соединяю их по customer_id.

Первая таблица - это сделка, и я храню там данные о сделке. И каждая сделка имеет объем и отдых, оплату и т. Д.

Вторая таблица - дескриптор, и мне сложно объяснить, для чего она предназначена, но таблица дескрипторов - это та же таблица сделок, в которой есть volume_handle, rest_handle, pay_handle и т. Д.

Мне нужно использовать левое соединение, потому что я хочу, чтобы все записи в таблице сделок и соответствующие записи из таблицы дескрипторов

Я хочу суммировать объем и сумму остатка от сделки, а также сумму volume_handle из дескриптора, а отношения между этими таблицами - customer_id и buy_id.

например таблица сделок:

id = 1
volume = 1000
rest = 1000
customer_id = 1
---------------
id = 2
volume = 500
rest = 0
customer_id = 1
---------------
id = 3 
volume = 2000
rest = 0
customer_id = 2

и таблица ручек:

id = 1
volume_handle = 3000
buy_id = 1

запрос, который я пишу:

select sum(deal.rest) as rest , sum(deal.volume) as volume , sum(handle.volume_handle) as handle  
from deal 
left join handle on deal.customer_id = handle.buy_id  
group by deal.customer_id;

и результат этого запроса:

//when customer_id is 1
volume = 1500
rest = 1000
handle = 6000

//when customer_id is 2
volume = 2000
rest = 0
handle = null

объем и остальное правильные, но дескриптор из второй таблицы неправильный, потому что результат sum (handle.volume_handle) равен 3000, а не 6000 (когда customer_id равен 1)

и я не знаю, как использовать агрегатные функции до объединения таблиц.

кто-нибудь здесь может написать запрос для этой проблемы?

1 Ответ

2 голосов
/ 20 апреля 2019

Поскольку в handle может быть несколько строк для каждого значения deal.customer_id, необходимо выполнить агрегирование в этой таблице до того, как вам JOIN до deal. Примерно так:

SELECT d.customer_id,
       SUM(d.rest) AS rest,
       SUM(d.volume) AS volume,
       MAX(h.volume_handle) AS handle
FROM deal d
LEFT JOIN (SELECT buy_id, SUM(volume_handle) AS volume_handle
           FROM handle
           GROUP BY buy_id) h ON h.buy_id = d.customer_id
GROUP BY d.customer_id

Выход:

customer_id rest    volume  handle
1           1000    1500    3000
2           0       2000    null

Демонстрация по dbfiddle

Обратите внимание, что я использовал MAX вокруг h.volume_handle, это не изменит результат (поскольку все проверяемые значения будут одинаковыми), но потребуется, чтобы избежать ошибок only_full_group_by.

...