GROUP BY SName
Результат реализации запроса:
Server: Msg 147
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.
Корректный синтаксис команды будет следующим:
SELECT SName, AVG(Mark)[Средняя оценка]
FROM Student s,Progress p
WHERE s.NRecordBook =p. NRecordBook
GROUP BY SName
HAVING AVG(Mark) >(SELECT AVG(Mark)
FROM Progress)Результат реализации запроса:
Наибольшее затруднение, как ни странно, вызывают функции по работе с датами, поэтому ниже мы приводим наиболее употребимые функции (см.
Приложение 4. Функции обработки дат и Приложение 5. Допустимые значения параметра частьДаты).
Пример 74
Задача.
Вывести год, в котором было принято на работу наибольшее число сотрудников.
Решение:
SELECT YEAR(DataHire)[Год приема на работу]
FROM Teacher
GROUP BY YEAR (DataHire)
HAVING COUNT(YEAR (DataHire))=(SELECT MAX(d.aCount)
FROM (SELECT COUNT (YEAR (DataHire)) aCount
FROM Teacher
GROUP BY(YEAR (DataHire))) d)
Результат реализации запроса:
Подзапрос на уровне предложения FROM
В ряде случаев нам надо сравнить результаты агрегирования строк. Выше был приведен пример коррелированного запроса, осуществляющего вывод имен студентов, которые имели оценки выше, чем средняя оценка по той группе, в которой они учатся (см. Пример 72). Применение подзапроса на уровне FROM позволяет значительно упростить реализацию этого запроса (см. Пример 75).
|
|
Пример 75
Задача.
Вывести имена студентов, чьи оценки хоть один раз были выше, чем средняя оценка в их группе.
Решение:
SELECT DISTINCT S.SName,S.NRecordBook
FROM Progress P
INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
INNER JOIN
(SELECT IDGroup,AVG(Mark) BMark
FROM Progress P
INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
GROUP BY IDGroup) b
ON S.IDGroup=b.IDGroup
WHERE mark>BMark
Результат реализации запроса:
Пример 76
Задача.
Вывести имена студентов, чьи средние оценки выше, чем средняя оценка в их группе.
Решение:
SELECT a.SName,a.NRecordBook,Amark [Средняя оценка студента], Bmark [Средняя оценка в группе]
FROM (SELECT p.NRecordBook,SName,IDGroup,AVG(Mark) Amark