Запросы SQL с группировкой строк

Запросы SQL с группировкой строк

Запросы с группировкой строк

 

Описанные выше агрегатные функции применялись ко всей таблице. Однако часто при создании отчетов появляется необходимость в формировании промежуточных итоговых значений, то есть относящихся к данным не всей таблицы, а ее частей. Для этого предназначена фраза GROUP BY. Она позволяет все множество строк таблицы разделить на группы по признаку равенства значений одного или нескольких столбцов (и выражений над ними). Фраза GROUP BY должна располагаться вслед за фразой WHERE (если она отсутствует, то за фразой FROM).

 

При наличии фразы GROUP BY фраза SELECT применяется к каждой группе, сформированной фразой группировки. В этом случае и действие агрегатных функций, указанных во фразе SELECT, будет распространяться не на всю результирующую таблицу, а только на строки в пределах каждой группы. Каждое выражение в списке фразы SELECT должно принимать единственное значение для группы, то есть оно может быть:

  • константой;
  • агрегатной функцией, которая оперирует всеми значениями аргумента в пределах группы и агрегирует их в одно значение (например, в сумму);
  • выражением, идентичным стоящему во фразе GROUP BY;
  • выражением, объединяющим приведенные выше варианты.

 

Самым простым вариантом использования фразы GROUP BY является группировка по значениям одного столбца.

 

Запрос: Количество клиентов по городам.

 

SELECT IdCity, COUNT(*) AS 'Кол-во клиентов'

FROM Customer

GROUP BY IdCity

 

Если в запросе используются фразы и WHERE, и GROUP BY, строки, не удовлетворяющие условию фразы WHERE, исключаются до выполнения группировки. Вследствие этого группировка производится только по тем строкам, которые удовлетворяют условию.

 

Запрос: Количество клиентов по городам с фамилией ‘Иванов’.

 

SELECT IdCity, COUNT(*) AS 'Кол-во клиентов'

FROM Customer

WHERE LName = 'Иванов'

GROUP BY IdCity

 

SQL позволяет группировать строки таблицы и по нескольким столбцам. В этом случае имена столбцов перечисляются во фразе GROUP BY через запятую.

 

Запрос: Количество клиентов по каждой фамилии и имени.

 

SELECT LName, FName, COUNT(*)

FROM Customer

GROUP BY LName, FName

 

Для отбора строк среди полученных групп применяется фраза HAVING. Она играет такую же роль для групп, что и фраза WHERE для исходных таблиц, и может использоваться лишь при наличии фразы GROUP BY. В предложении SELECT фразы WHERE, GROUP BY и HAVING обрабатываются в следующем порядке.

 

  1. Фразой WHERE отбираются строки, удовлетворяющие указанному в ней условию;
  2. Фраза GROUP BY группирует отобранные строки;
  3. Фразой HAVING отбираются группы, удовлетворяющие указанному в ней условию.

 

Значение условия, указываемого во фразе HAVING, должно быть уникальным для всех строк каждой группы. Поэтому правила использования имен столбцов и агрегатных функций во фразе HAVING такие же, как и для фразы SELECT при наличии фразы GROUP BY. Это значит, что во фразе HAVING в качестве операндов сравнения можно использовать только группируемые столбцы или агрегатные функции.

 

Запрос: Список городов, количество клиентов из которых больше 10.

 

SELECT IdCity

FROM Customer

GROUP BY IdCity

HAVING COUNT(*)>10

 

Задание для самостоятельной работы: Сформулируйте на языке SQL запросы на выборку следующих данных:

  • Список всех заказов с указанием их суммарной стоимости;
  • Список клиентов, которые за заданный период (например, сентябрь 2010 года) совершили более 3 заказов.
Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Комментарий будет опубликован после проверки

(обязательно)