Программирование >>  Преобразование значений null 

1 ... 62 63 64 [ 65 ] 66 67 68 ... 219


30 20 30 30 10 20 10 30 20 30 20 10

500 1300

select count(*), count(deptno), count(comm), count(hello) from emp

COUNT(*) COUNT(DEPTNO) COUNT(COMM) COUNT(HELLO)

select deptno, count(*), count(comm), count(hello) from emp group by deptno

DEPTNO COUNT(*) COUNT(COMM) COUNT(HELLO)

10 20 30

Если во всех строках переданного в COUNT столбца содержатся значения NULL или если таблица пуста, COUNT возвратит нуль. Следует также заметить, что даже если в операторе SELECT определена только агрегатная функция, по-прежнему можно осуществлять группировку по другим столбцам таблицы; например:

select count(*) from emp group by deptno

COUNT(*)

Обратите внимание, что группировка осуществляется по DEPTNO, несмотря на то, что этот столбец не указан в SELECT. Включение в список оператора SELECT столбца, по которому осуществляется группировка, делает код более понятным, но не является обязательным. Если все-таки столбец включен (в список SELECT), он обязательно должен быть указан в операторе GROUP BY.



Обсуждение

Выражение COUNT(*) обеспечивает подсчет всех строк (независимо от их значений; поэтому учитываются как строки со значениями NULL, так и строки с определенными значениями). Но когда в функции COUNT задан конкретный столбец, подсчитывается количество не-NULL значений в этом столбце. В обсуждении предыдущего рецепта затрагивалось это различие. В данном рецепте функция COUNT(COMM) возвращает число не-NULL значений в столбце COMM. Поскольку комиссионные получают только служащие, занимающие определенную должность, в результате выполнения COUNT(COMM) возвращает количество таких служащих.

Вычисление текущей суммы Задача

Требуется вычислить текущую сумму значений столбца.

Решение

В качестве примера следующие решения показывают, как вычисляется текущая сумма заработных плат всех служащих. Для удобства чтения результаты по возможности упорядочены по столбцу SAL, чтобы можно было увидеть процесс вычисления текущих сумм.

См. также

Приложение А для повторения функциональных возможностей GROUP BY.

Подсчет значений в столбце Задача

Требуется подсчитать количество определенных (не-NULL) значений в столбце. Например, стоит задача выяснить, сколько служащих получают комиссионные.

Решение

Подсчитываем число не-NULL значений в столбце COMM таблицы EMP, используя функцию COUNT и имя столбца в качестве ее аргумента:

select count(comm) from emp

COUNT(COMM)



1 select

ename,

sal,

sum(sal) over

(order by sal,empno)

3 from

4 order by 2

ENAME

SAL RUNNING TOTAL

SMITH

JAMES

1750

ADAMS

1100

2850

WARD

1250

4100

MARTIN

1250

5350

MILLER

1300

6650

TURNER

1500

8150

ALLEN

1600

9750

CLARK

2450

12200

BLAKE

2850

15050

JONES

2975

18025

SCOTT

3000

21025

FORD

3000

24025

KING

5000

29025

MySQL, PostgreSQL и SQL Server

Для вычисления текущей суммы используется скалярный подзапрос (без оконной функции, такой как SUM OVER, нельзя так просто упорядочить результирующее множество по столбцу SAL, как в решении для DB2 и Oracle). В конечном счете сумма вычисляется правильно (окончательное значение совпадает с полученным в предыдущем рецепте), но промежуточные значения отличаются из-за отсутствия упорядоченности:

1 select e.ename, e.sal,

2 (select sum(d.sal) from emp d

3 where d.empno <= e.empno) as running total

4 from emp e

5 order by 3

ENAME

SAL RUNNING TOTAL

SMITH

ALLEN

1600

2400

WARD

1250

3650

JONES

2975

6625

MARTIN

1250

7875

BLAKE

2850

10725

CLARK

2450

13175

SCOTT

3000

16175

KING

5000

21175

Для вычисления текущей суммы используется аналитическая версия функции SUM:



1 ... 62 63 64 [ 65 ] 66 67 68 ... 219

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