GROUP BY в PostgreSQL

Статья основана на 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 тем будет скоро доступна. Если вы хотите быстрее получить доступ – присоединяйтесь к онлайн группе, ссылка доступна в описании курса.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

5 + пятнадцать =