Выберите из нескольких таблиц, даже если у вас нет соответствующей записи - PullRequest
0 голосов
/ 04 октября 2019

У меня есть три таблицы: продукт, продажа и покупка.

Мне нужно получить сумму продаж и сумму покупок продуктов. Даже если продажи не были сделаны, мне нужно, чтобы показать покупки и наоборот. Что-то вроде:

Product   | Sum of sales | Sum of purchases |
____________________________________________
product 1 | 10000        | 45000            |
product 2 | 20000        | 0 (or null)      |
product 3 | 0(or null)   | 20000            |

Я пробовал это, но он будет возвращать только те товары, в которых есть продажи и покупки одновременно:

select prod.name, sum(s.total), sum(p.total)
from product prod
inner join sale s on s.prod_id = prod.id
inner join purchase p on p.prod_id = prod.id
group by 1;

Заранее спасибо.

1 Ответ

0 голосов
/ 04 октября 2019

Ваш запрос имеет несколько проблем. Во-первых, из-за INNER JOIN он (как вы обнаружили) будет возвращать только значения для продуктов, которые имеют как продажи, так и покупки. Эту проблему можно решить с помощью LEFT JOIN (с необязательным COALESCE для преобразования значений null в 0). Вторая проблема заключается в том, что вы получите повторяющиеся строки из вашего JOIN, где имеется более одной продажи или покупки продукта. Чтобы обойти это, необходимо выполнить агрегирование в производных таблицах для продаж и покупок:

SELECT pr.name,
       s.total AS sales,                    -- will show null if no sales
       COALESCE(p.total, 0) AS purchases    -- will show 0 if no purchases
FROM product pr
LEFT JOIN (SELECT prod_id, SUM(total) AS total
           FROM sale
           GROUP BY prod_id) s ON s.prod_id = pr.id
LEFT JOIN (SELECT prod_id, SUM(total) AS total
           FROM purchase
           GROUP BY prod_id) p ON p.prod_id = pr.id
...