Выборка и группировка в SQL: сумма колонки, неуникальные имена

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для выборки из таблицы сразу нескольких столбцов и группировки по одному из них используются агрегатные функции, вроде SUM() или MAX(). Рассмотрим таблицу sales, в которой присутствуют поля salesperson и sales_amount:

SQL
Скопировать код
SELECT salesperson, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY salesperson;

Здесь столбец salesperson выступает ключом для группировки и объединения отдельных продаж. В SELECT-запросе каждый столбец, не участвующий в группировке, должен быть включен с помощью агрегатной функции для корректности SQL-запроса.

Кинга Идем в IT: пошаговый план для смены профессии

Если неуникальные столбцы ставят в тупик 🤯

Неуникальные столбцы могут усложнить интерпретацию результатов. В этом случае функция MAX() может оказаться крайне полезной:

SQL
Скопировать код
SELECT ProductID, MAX(ProductName) AS ProductName, SUM(OrderQuantity) AS TotalOrdered
FROM Products
GROUP BY ProductID;

Использование MAX() позволяет включить в результаты выборки не сгруппированный столбец, например ProductName, по ProductID.

Работа со сложными конструкциями: CTE и подзапросы

Для удовлетворения сложных требований в группировке часто используют Common Table Expressions (CTE) и подзапросы:

SQL
Скопировать код
WITH GroupedData AS (
  SELECT ProductID, SUM(OrderQuantity) AS TotalOrdered
  FROM Orders
  GROUP BY ProductID
)
SELECT p.ProductID, p.ProductName, g.TotalOrdered
FROM Products p
JOIN GroupedData g ON p.ProductID = g.ProductID;

Разбиение запроса на части упрощает его использование и помогает предотвратить путаницу.

Нет двух одинаковых с использованием GROUP_CONCAT

Для получения списка уникальных значений в рамках одной группы комбинация GROUP_CONCAT и DISTINCT обычно оказывается незаменимой:

SQL
Скопировать код
SELECT ProductID, GROUP_CONCAT(DISTINCT SupplierID ORDER BY SupplierID) AS Suppliers
FROM ProductSuppliers
GROUP BY ProductID;

Функция GROUP_CONCAT группирует значения SupplierID в рамках каждого ProductID, а DISTINCT обеспечивает уникальность значений в списке.

Визуализация

Представим таблицу заказов в виде спортивного табло:

ИгрокОчкиПередачиПодборыКоманда
Джон Доу30510A
Джейн Смит2078A
Майк Браун15115B
...............

Сгруппировав данные по командам и применив к ним агрегирующие функции, получаем

SQL
Скопировать код
SELECT Team, SUM(Points), SUM(Assists), SUM(Rebounds)
FROM Scoreboard
GROUP BY Team;

И в конечном итоге имеем обобщенное представление результатов каждой команды:

КомандаОбщее число очковОбщее число передачОбщее число подборов
A501218
B15115
............

Это позволяет наглядно увидеть коллективный вклад каждого игрока в результаты команды.

Временные прибежища

Временные таблицы могут оказаться незаменимым инструментом при работе со сложными данными:

SQL
Скопировать код
CREATE TEMPORARY TABLE TempSales
AS
SELECT salesperson, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY salesperson;

SELECT t.salesperson, t.total_sales
FROM TempSales t;

Их применение делает запросы более понятными и структурированными.

Спасательный VARCHAR

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

SQL
Скопировать код
SELECT s1.salesperson, s2.total_sales
FROM Sales s1
JOIN (
  SELECT salesperson, SUM(sales_amount) AS total_sales
  FROM Sales
  GROUP BY salesperson
) s2 ON s1.salesperson = s2.salesperson;

Для глаз и ума: форматированный вывод

Порядок в данных способствует ясности мысли, поэтому использование ORDER BY необходимо для структурированной визуализации данных:

SQL
Скопировать код
SELECT CategoryID, SUM(ProductSales) 
FROM ProductSalesData
GROUP BY CategoryID
ORDER BY SUM(ProductSales) DESC;

Сортировка категорий по объему продаж дает ясное представление о наиболее успешных сегментах.

Полезные материалы

  1. SQL GROUP BY Statement — основы использования GROUP BY в SQL.
  2. SQL GROUP BY | Intermediate SQL – Mode — полное руководство по использованию GROUP BY и агрегатных функций.
  3. sql – Использование group by на нескольких столбцах – Stack Overflow — подборка практических примеров и решений для GROUP BY с использованием нескольких столбцов.
  4. Vertabelo Database Modeler — советы по эффективной группировке в SQL с множеством примеров.
  5. Понимание сложных GROUP BY Clauses – YouTube — видеоурок по пониманию сложных конструкций GROUP BY.