Могу ли я создать запрос на основе нескольких объединений с суммой? - PullRequest
0 голосов
/ 25 октября 2019

Я выхожу из своей лиги здесь, но очень стараюсь (пока 5 часов попыток). Использование MariaDB. Моя проблема в том, что я не знаю синтаксиса с SQL

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

Я считаю, что мне нужно создать запрос, который выдаст |categories_name|SUM(products_quantity)| BETWEEN диапазон дат и GROUPed BY categories_name. (Я могу ошибаться)

Необходимые мне данные распределены по 5 таблицам:

tbl_orders
orders_id   date_purchased
1           1900-01-01
2           1900-01-02
3           1900-01-03

tbl_orders_products
orders_id   products_id   products_quantity
1           100           5
1           200           2
2           100           1
3           100           1
3           300           2
3           400           1

tbl_products_to_categories
products_id   categories_id
100           10
200           20
300           30
400           40

tbl_categories
categories_id   parent_id
10              50
20              60
30              70
40              80

tbl_categories_description
parent_id   categories_name
50          categoryA
60          categoryB
70          categoryC
80          categoryD

Я пробовал так много вариантов SQL, что даже не знаю, какой из них опубликоватьздесь, чтобы я не повёл более знающего человека по неверному пути. Как (если это возможно) я могу получить вывод, который я ищу? Я успешно выполнил INNER JOIN и выполнил запрос из трех таблиц, но это сбивает меня с толку. Должен ли я просто взять урок SQL для колледжа, прежде чем я попытаюсь это сделать?

Ответы [ 2 ]

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

Не могу понять разницу между таблицами tbl_categories и tbl_categories_description.

В любом случае, следующий запрос вернет общее количество продуктов для каждой категории в определенном диапазоне дат.

select
  d.parent_id,
  d.categories_name,
  sum(op.products_quantity) as total_products
from tbl_orders o
join tbl_orders_products op on op.orders_id = o.orders_id
join tbl_products_to_categories pc on pc.products_id = op.products_id
join tbl_categories c on c.categories_id = pc.categories_id
join tbl_categories_description d on d.parent_id = c.parent_id
where o.date_purchased between '1900-01-02' and '1900-01-18'
group by d.parent_id
0 голосов
/ 25 октября 2019

Это простое объединение между всеми таблицами и сгруппированной суммой.

SELECT cd.categories_name, SUM(op.products_quantity) AS total
FROM tbl_categories_description AS cd
JOIN tbl_categories AS c ON c.parent_id = cd.parent_id
JOIN tbl_products_to_categories AS pc ON pc.categories_id = c.categories_id
JOIN tbl_orders_products AS op ON op.products_id = pc.products_id
JOIN tbl_orders AS o ON o.orders_id = op.orders_id
WHERE o.date_purchased BETWEEN '1900-01-01' AND '1900-01-02'
GROUP BY cd.categories_name

Если вы хотите получить нулевой счет для категорий без продуктов или продаж, вам нужно изменить все объединения на LEFT JOIN и поместите условие даты в последнее ON условие.

SELECT cd.categories_name, IFNULL(SUM(p.products_quantity), 0) AS total
FROM tbl_categories_description AS cd
LEFT JOIN tbl_categories AS c ON c.parent_id = cd.parent_id
LEFT JOIN tbl_products_to_categories AS pc ON pc.categories_id = c.categories_id
LEFT JOIN tbl_orders_products AS op ON op.products_id = pc.products_id
LEFT JOIN tbl_orders AS o ON o.orders_id = op.orders_id 
        AND o.date_purchased BETWEEN '1900-01-01' AND '1900-01-02'
GROUP BY cd.categories_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...