Статья основана на 22 видео из 30 тем курса SQL c 0 от Аристова Евгения. Ссылки на видео на платформах RUTUBE и VK видео.
В прошлых статьях уже разбирались разные части SELECT – WHERE, JOIN, ORDER BY. Сегодня поговорим о GROUP BY.
Результат выборки SELECT можно сгруппировать по какому-либо условию и посчитать результат с помощью GROUP BY.
Синтаксис:
SELECT
column_1,
column_2,
…,
aggregate_function(column_3)
FROM
table_name
GROUP BY
column_1,
column_2,
…;
Для того, чтобы посчитать результат, существуют агрегатные функции. Можно найти среднее значение, минимальное/максимальное, сумму и т.д. На одну позицию значения, указанного как условие группировки, существует целая группа строк. К этой группе и применяются агрегатные функции.
Создадим таблицу Склад:
CREATE TABLE warehouse(
id serial,
name text,
price decimal,
kolvo int);
Вставим в неё значения:
INSERT INTO warehouse (name, price,kolvo) VALUES
('apples', 100,20),
('bananas', 120,30),
('lemons', 300,40),
('pineapple', 52,500);
Создадим таблицу Продажи:
CREATE TABLE sales(
id serial,
fk_warehouse int,
kolvo int,
salesdate date DEFAULT now());
Добавим строки в таблицу Продажи:
INSERT INTO sales(fk_warehouse, kolvo,salesdate) VALUES
(1, 10,'20230915'),
(2, 5,'2023-09-14');
INSERT INTO sales(fk_warehouse, kolvo,salesdate) VALUES
(1, 10,'20230915'),
(2, 5,'2023-09-14');
INSERT INTO sales(fk_warehouse, kolvo,salesdate) VALUES
(3, 20,'20230911'),
(4, 50,'2023-09-12');
Узнаем суммы продаж по именам товаров с количеством больше 5 единиц за раз. Для этого объединим две таблицы по ключам (JOIN ON), установим условие WHERE и отсортируем по имени.
Разберём запрос по частям.
Создаем запрос по продажам товаров (объедение таблиц):
SELECT s.*, warehouse.name, warehouse.price
FROM sales s
JOIN warehouse
ON s.fk_warehouse=warehouse.id;
Выберем только продажи больше 5 штук:
SELECT s.*, w.name, w.price
FROM sales s
JOIN warehouse w
ON s.fk_warehouse=w.id
WHERE s.kolvo>5;
Сгруппируем по имени продукта, использовав в качестве агрегатной функции сумму продаж (умножение количества на цену):
SELECT w.name as n, sum(s.kolvo*w.price) AS summa
FROM sales s
JOIN warehouse w
ON s.fk_warehouse=w.id
WHERE s.kolvo>5
GROUP BY w.name;
Теперь отсортируем:
SELECT w.name as n, sum(s.kolvo*w.price) AS summa
FROM sales s
JOIN warehouse w
ON s.fk_warehouse=w.id
WHERE s.kolvo>5
GROUP BY w.name
ORDER BY n;
Презентация к статье здесь.
23 из 30 тем будет скоро доступна. Если вы хотите быстрее получить доступ – присоединяйтесь к онлайн группе, ссылка доступна в описании курса.
Добавить комментарий