LEFT JOIN с множественным вложенным выбором - PullRequest
0 голосов
/ 18 декабря 2018

Следующее утверждение удивительно работает, но я не уверен, что объединение в одну таблицу 3 раза будет эффективным.Мне пришлось отключить ONLY_FULL_GROUP_BY, чтобы он заработал.

В игре 2 стола.Одна - это главная таблица с информацией о Дистрибьюторе, вторая - это таблица покупок, которая содержит amount, date и id соответствующего Дистрибьютора в основной таблице (ассоциация).

Там3 вещи, которые мне нужны.Продажи за год, в которых СУММА сумма продаж определенного Дистрибьютора за текущий год.Продажи в прошлом году, которые делают то же самое для предыдущего года.Затем, наконец, просто получите самую последнюю дату и сумму покупки.

Пользователь должен иметь возможность фильтровать по этим значениям (lys, ytd и т. Д.), Поэтому объединение их в качестве переменных выглядит какпутьРазмер БД составляет около 7000 записей.

SELECT 
    d.*,
    ytd_total,
    lys_total,
    last_amount,
    last_purchase

FROM Distributor as d
LEFT JOIN (
    SELECT
        assoc, SUM(amount) ytd_total
        FROM purchases
        WHERE db = 1 AND purchase_date >= '{$year}-01-01'
        GROUP BY assoc
) AS ytd
ON ytd.assoc = d.id

LEFT JOIN (
    SELECT
        assoc, SUM(amount) lys_total
        FROM purchases
        WHERE db = 1 AND purchase_date BETWEEN '{$lyear}-01-01' AND '{$lyear}-12-31'
        GROUP BY assoc
) AS lys
ON lys.assoc = d.id

LEFT JOIN (
    SELECT
        assoc, amount last_amount, purchase_date last_purchase
        FROM purchases
        WHERE db = 1
        GROUP BY assoc
) AS lst
ON lst.assoc = d.id

WHERE ........

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете выполнять больше работы в каждом запросе агрегации.Я думаю, это больше того, что вы хотите:

select d.*, pa.ytd_total, pa.lys_total, pa.last_purchase_date, p.amount
from distributor d left join
     (select p.assoc,
             sum(case when p.purchase_date >= '{$year}-01-01' then p.amount end) as ytd_total,
             sum(case when p.purchase_date BETWEEN '{$lyear}-01-01' AND '{$lyear}-12-31' then p.amount end) as lys_total,
             max(p.purchase_date) as last_purchase_date             
      from purchases p
      where p.db = 1
      group by p.assoc
     ) pa left join
     purchases p
     on pa.assoc = p.assoc and pa.last_purchase_date = p.purchase_date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...