GROUP BY (группировка)
должна располагаться вслед за фразой WHERE.
При наличии фразы GROUP BY фраза SELECT применяется к каждой группе, сформированной фразой группировки. Каждое выражение в списке фразы SELECT должно принимать единственное значение для группы, т.е. оно может быть:
•константой;
•агрегатной функцией, которая оперирует всеми значениями ее аргумента только в пределах группы и сводит эти значения к единственному значению (например, к сумме);
•выражением, идентичным тому, что стоит во фразе
GROUP BY;
•выражением, которое построено из приведенных выше выражений.
Группирование по одному столбцу (1)
Запрос. По каждому корпусу подсчитать количество находящихся в них кафедр.
SELECT Building AS "Корпус", COUNT(*) AS "К-во кафедр"
FROM DEPARTMENT
GROUP BY Building;
Корпус К-во кафедр
---------- ----------------
3 3
51
62
•3 строк выбрано.
Это самый простой вариант использования GROUP BY. Таблица группируется по значениям одного столбца. Приведем примеры
Группирование по одному столбцу (2)
Запрос. По каждой из профессий указать суммарный фонд заработной платы.
SELECT Post AS "Должность", SUM(Salary +
Rise) AS "Сумма зарплаты"
FROM TEACHER
GROUP BY Post;
Должность Сумма зарплаты |
|
--------------- ------------------------ |
|
ассистент |
2960 |
доцент |
4761 |
преподаватель |
3420 |
профессор |
4660 |
• 4 строк выбрано.
Если в запросе используется фраза WHERE и GROUP BY, то строки, не удовлетворяющие фразе WHERE, исключаются до выполнения группирования, то есть группирование производится только по тем строкам, которые удовлетворяют фразе WHERE.
Группирование по одному столбцу (3)
Запрос. Вывести названия факультетов и суммарный фонд финансирования их кафедр.
SELECT f.Name AS "Факультет", SUM(d.Fund) AS "Фонд кафедр"
FROM FACULTY f, DEPARTMENT d WHERE f.FacPK = d.FacFK
GROUP BY f.Name;
Факультет Фонд кафедр
------------------- ------------------
информатика 48000 кибернетика 51100
• 2 строк выбрано.
Группирование по нескольким столбцам
Запрос. Вывести количество лекций, читаемых преподавателями–доцентами по неделям (первая и вторая).
SELECT t.Name, l.Week, Count(*) FROM TEACHER t, LECTURE l
WHERE t.TchPK = l.TchFK AND LOWER(t.Post)= 'доцент' GROUP BY t.Name, l.Week;
NAME WEEK СOUNT(*)
----------- ----------- -------------
Заплатинский 1 1 Лебедь 1 1 Лебедь 2 1 Радишевский 1 1 Радишевский 2 1
• 5 строк выбрано.