loading..
Русский    English
13:24
листать

Предложение GROUP BY

Пусть теперь мы хотим получить количество компьютеров, подходящих по RAM к каждому типу операционных систем. Тогда мы можем написать следующий запрос:

Консоль
Выполнить
  1. SELECT
  2.        CASE
  3.             WHEN ram < 64
  4.             THEN 'W95'
  5.             WHEN ram < 128
  6.             THEN 'W98'
  7.             ELSE 'W2k'
  8.         END Type,
  9.         COUNT(*) Qty
  10. FROM PC
  11. GROUP BY
  12.         CASE
  13.              WHEN ram < 64
  14.              THEN 'W95'
  15.              WHEN ram < 128
  16.              THEN 'W98'
  17.              ELSE 'W2k'
  18.         END;

В результате выполнения запроса получим:

Type    Qty
W2k    5
W95    3
W98    3

Здесь мы дублируем оператор CASE в предложении SELECT, чтобы получить столбец с наименованием операционной системы.

Использование оператора CASE в предложении GROUP BY позволяет в рамках одного запроса выполнять группировку по разному числу столбцов. Рассмотрим, например, следующую задачу.

Для каждой комбинации скорости процессора и объема жесткого диска определить среднюю цену ПК. Для ПК со скоростью процессора менее 600 выполнять группировку только по скорости процессора.

Сначала для сравнения приведем результаты группировки по одному (speed) и двум столбцам (speed, hd) соответственно.

Консоль
Выполнить
  1. SELECT speed,MAX(hd) max_hd, AVG(price) avg_price  FROM pc
  2. GROUP BY speed;

speed    max_hd   avg_price
450    10    350.00
500    10    487.50
600    14    850.00
750    20    900.00
800    20    970.00
900    40    980.00

Консоль
Выполнить
  1. SELECT speed, hd max_hd, AVG(price) avg_price  FROM pc
  2. GROUP BY speed, hd
  3. ORDER BY speed;

speed    max_hd   avg_price
450    8    350.00
450    10    350.00
500    5    600.00
500    10    375.00
600    8    850.00
600    14    850.00
750    14    850.00
750    20    950.00
800    20    970.00
900    40    980.00

Поскольку в каждой группе значения hd совпадают, можно max(hd) и hd использовать равноправно.

Теперь дадим решение нашей задачи:

Консоль
Выполнить
  1. SELECT speed, MAX(hd) max_hd, AVG(price) avg_price  FROM pc
  2. GROUP BY speed, CASE WHEN speed >= 600 THEN hd ELSE speed END
  3. ORDER BY speed;

speed    max_hd    avg_price
450    10    350.00
500    10    487.50
600    8    850.00
600    14    850.00
750    14    850.00
750    20    950.00
800    20    970.00
900    40    980.00

Когда speed >= 600, выполняется группировка по столбцам speed, hd. В противном случае группировка выглядит так:

  1. GROUP BY speed, speed
что эквивалентно группировке одному столбцу. Кстати, оператор CASE в последнем решении можно было написать без ELSE:

Консоль
Выполнить
  1. SELECT speed, MAX(hd) max_hd, AVG(price) avg_price  FROM pc
  2. GROUP BY speed, CASE WHEN speed >= 600 THEN hd END
  3. ORDER BY speed;

Хотя явная группировка - GROUP BY speed, NULL - будет вызывать ошибку.


Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100