2.5.3. Фраза GROUP BY
Мы показали, как можно вычислить массу определенного продукта, поставляемого поставщиками. Предположим, что теперь требуется вычислить общую массу каждого из продуктов, поставляемых в настоящее время поставщиками. Это можно легко сделать с помощью предложения
SELECT ПР, SUM(К_во)
FROM Поставки
GROUP BY ПР;
Результат показан на рис. 2.3,а.
а) | б) | в) | г) |
ПР |
9 | 0 |
11 | 150 |
12 | 30 |
15 | 370 |
1 | 370 |
3 | 250 |
5 | 170 |
6 | 220 |
8 | 150 |
7 | 200 |
2 | 0 |
4 | 100 |
13 | 190 |
14 | 70 |
16 | 250 |
17 | 50 |
10 | 220 |
|
ПС | ПР | Цена | К_во |
1 | 9 | -0- | -0- |
3 | 9 | -0- | -0- |
5 | 9 | -0- | -0- |
1 | 11 | 1.50 | 50 |
5 | 11 | -0- | -0- |
6 | 11 | -0- | -0- |
8 | 11 | 1.00 | 100 |
1 | 12 | 3.00 | 10 |
3 | 12 | 2.50 | 20 |
6 | 12 | -0- | -0- |
1 | 15 | 2.00 | 170 |
3 | 15 | 1.50 | 200 |
2 | 1 | 3.60 | 300 |
7 | 1 | 4.20 | 70 |
2 | 3 | -0- | -0- |
7 | 3 | 4.00 | 250 |
. . . |
|
ПР |
1 | 370 |
2 | 0 |
3 | 250 |
4 | 100 |
5 | 170 |
6 | 220 |
7 | 200 |
8 | 150 |
9 | 0 |
10 | 220 |
11 | 150 |
12 | 30 |
13 | 190 |
14 | 70 |
15 | 370 |
16 | 250 |
17 | 50 |
|
ПР |
9 | 0 |
11 | 150 |
12 | 30 |
15 | 70 |
1 | 370 |
3 | 250 |
5 | 70 |
6 | 140 |
8 | 150 |
7 | 200 |
2 | 0 |
4 | 100 |
13 | 190 |
14 | 70 |
16 | 250 |
17 | 50 |
10 | 220 |
|
Рис. 2.3. Иллюстрации к фразе GROUP BY
Фраза GROUP BY (группировать по) инициирует перекомпоновку указанной во FROM таблицы по группам, каждая из которых имеет одинаковые значения в столбце, указанном в GROUP BY. В рассматриваемом примере строки таблицы Поставки группируются так, что в одной группе содержатся все строки для продукта с ПР = 1, в другой – для продукта с ПР = 2 и т.д. (см. рис. 2.3.б). Далее к каждой группе применяется фраза SELECT. Каждое выражение в этой фразе должно принимать единственное значение для группы, т.е. оно может быть либо значением столбца, указанного в GROUP BY, либо арифметическим выражением, включающим это значение, либо константой, либо одной из SQL-функций, которая оперирует всеми значениями столбца в группе и сводит эти значения к единственному значению (например, к сумме).
Отметим, что фраза GROUP BY не предполагает ORDER BY. Чтобы гарантировать упорядочение по ПР результата рассматриваемого примера (рис. 2.3,в) следует дать запрос
SELECT ПР, SUM(К_во)
FROM Поставки
GROUP BY ПР
ORDER BY ПР;
Наконец, отметим, что строки таблицы можно группировать по любой комбинации ее столбцов. Так, по запросу
SELECT Т, БЛ, COUNT(БЛ)
FROM Заказ
GROUP BY Т, БЛ;
можно узнать коды и количество порций блюд, заказанных отдыхающими пансионата (32 человека) на каждую из трапез следующего дня:
Т | БЛ | COUNT(БЛ) |
1 | 3 | 18 |
1 | 6 | 14 |
1 | 19 | 17 |
1 | 21 | 15 |
... |
Если в запросе используются фразы WHERE и GROUP BY, то строки, не удовлетворяющие фразе WHERE, исключаются до выполнения группирования.
Например, выдать для каждого продукта его код и общий объем возможных поставок, учитывая временную недееспособность поставщика с ПС=2:
SELECT ПР, SUM(К_во)
FROM Поставки
WHERE ПС <> 2
GROUP BY ПР;
Результат, приведенный на рис. 2.3,г, отличается от результата (рис. 2.3,а) аналогичного запроса для всех поставщиков объемом поставок продуктов с кодами 15, 5 и 6.
2.5.2 | Содержание | 2.5.4