Программирование >>  Построение запросов sql 

1 ... 31 32 33 [ 34 ] 35 36 37 ... 101


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

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

Элементы, указанные в предложении GROUP BY, называются элементами группировки, и именно они определяют, по какому признаку строки делятся на группы. При этом группой называется набор строк, имеющих одинаковое значение в элементе (элементах) группировки.

Синтаксис предложения GROUP BY имеет следующий вид:

GROUP BY <элемент группировки1> [, <элемент группировки2>] ,

<элемент группировки> := {[<таблица>.] столбец

порядковый номер столбца псевдоним столбца <выражение>}.

Фактически в качестве элемента группировки может выступать любой возвращаемый элемент, указанный в предложении SELECT, кроме значений агрегатных функций. В выражение, представляющее собой <элемент группировки>, могут входить скалярные функции, агрегатные функции из различных контекстов или это может быть любая CASE-операция.

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

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

SELECT NachislYear, AVG(NachislSum) FROM NachislSumma GROUP BY NachislYear;.

Результат выполнения запроса представлен на рис. 3.54.

NACHISLYEAR

1998

28,12

1999

32,89

2000

58,36

2001

58,17

Рис. 3.54. Результат выполнения запроса с группировкой



Возможна группировка результатов запроса на основании порядкового номера возвращаемого элемента в предложении SELECT. Таким образом, запрос

SELECT NachislYear, AVG(NachislSum) FROM NachislSumma

GROUP BY 1;

выдаст такой же результат, как и предыдущий запрос.

Например, если для каждого абонента требуется вывести общее количество оплат с указанным в этой же строке максимальным для него значением оплаты, то можно сгруппировать результат по номеру лицевого счета и использовать в качестве второго возвращаемого элемента выражение с агрегатными функциями COUNT и MAX. Соответствующий запрос будет выглядеть следующим образом:

SELECT AccountCD, (COUNT(*) - с максимальной суммой

MAX(PaySum)) AS Pay Count

FROM PaySumma

GROUP BY 1;.

Результат выполнения запроса представлен на рис. 3.55.

ACCOUNTCD

PAY COUNT

005488

4 - с максимальной суммой 62.13

015527

3 - с максимальной суммой 38.32

080047

6 - с максимальной суммой 80.00

080270

4 - с максимальной суммой 60.10

080613

5 - с максимальной суммой 56.00

115705

8 - с максимальной суммой 250.00

126112

2 - с максимальной суммой 25.30

136159

2 - с максимальной суммой 8.30

136160

4 - с максимальной суммой 56.00

136169

5 - с максимальной суммой 58.70

443069

4 - с максимальной суммой 80.00

443690

2 - с максимальной суммой 21.67

Рис. 3.55. Результат выполнения запроса с группировкой

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

SELECT NachislSum AS Summa 50, COUNT(*) FROM NachislSumma WHERE NachislSum > 50

GROUP BY Summa 50;.

Результат выполнения запроса представлен на рис. 3.56.



SUMMA 50

COUNT

56,00

57,10

58,10

58,70

60,10

62,13

80,00

250,00

Рис. 3.56. Результат выполнения запроса с группировкой по псевдониму

В SQL можно группировать результаты запроса на основании двух или более элементов.

Например, необходимо для каждого абонента вывести наименьшее значение оплаты за услуги газоснабжения за 1999 и 2000 годы. Для этого нужно сгруппировать таблицу PaySumma по номерам лицевых счетов абонентов и по годам, применяя к значениям оплат агрегатную функцию MIN следующим образом:

SELECT AccountCD, PayYear, MIN(Paysum) FROM PaySumma WHERE PayYear IN (1999, 2000) GROUP BY AccountCD, PayYear;.

Результат выполнения запроса представлен на рис. 3.57.

ACCOUNTCD

PAYYEAR

005488

1999

56,00

005488

2000

46,00

015527

1999

38,32

080047

1999

22,20

080270

2000

58,10

080613

2000

12,60

115705

1999

37,15

115705

2000

40,00

126112

2000

15,30

136159

1999

8,30

136160

1999

56,00

136160

2000

18,30

136169

1999

25,32

443690

1999

21,67

Рис. 3.57. Результат выполнения запроса с группировкой по двум столбцам

СУБД Firebird в качестве элемента группировки допускает определение выражений, в которых разрешено использовать SQL-функции SUBSTRING и EXTRACT, а также операцию CASE и функции вывода.



1 ... 31 32 33 [ 34 ] 35 36 37 ... 101

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика