Este artículo ofrece una descripción general de la función analítica COUNT. Si es nuevo en las funciones analíticas, probablemente debería leer primero esta introducción a las funciones analíticas.
- Preparar
- COUNT como una Función Agregada
- Funcion Analitica COUNT
Preparar
Los ejemplos de este artículo requieren la siguiente tabla.
--DROP TABLE emp PURGE; CREATE TABLE emp ( empno NUMBER(4) CONSTRAINT pk_emp PRIMARY KEY, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2) ); INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20); INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30); INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30); INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20); INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30); INSERT INTO emp VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30); INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10); INSERT INTO emp VALUES (7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20); INSERT INTO emp VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10); INSERT INTO emp VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30); INSERT INTO emp VALUES (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20); INSERT INTO emp VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30); INSERT INTO emp VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20); INSERT INTO emp VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10); COMMIT;
COUNT como función agregada
La función agregada COUNT devuelve el número de filas de un conjunto. Como función agregada, reduce el número de filas, de ahí el término «aggregate». Si los datos no están agrupados, convertimos las 14 filas de la tabla EMP en una sola fila con los valores agregados. El uso de «*» o una columna obligatoria como parámetro devuelve el número total de filas del conjunto. El uso de una columna opcional devuelve el número total de filas con un valor no nulo en esa columna.
SELECT COUNT(*) AS count_total, COUNT(sal) AS count_sal, COUNT(comm) AS count_comm FROM emp; COUNT_TOTAL COUNT_SAL COUNT_COMM ----------- ---------- ---------- 14 14 4 SQL>
Podemos obtener más granularidad de la información al incluir una cláusula GROUP BY. En el siguiente ejemplo, vemos los valores mínimo y máximo por departamento.
SELECT deptno, COUNT(*) AS count_total, COUNT(sal) AS count_sal, COUNT(comm) AS count_comm FROM emp GROUP BY deptno ORDER BY deptno; DEPTNO COUNT_TOTAL COUNT_SAL COUNT_COMM ---------- ----------- ---------- ---------- 10 3 3 0 20 5 5 0 30 6 6 4 SQL>
En ambos casos, hemos agregado los datos para obtener los valores, devolviendo menos filas de las que comenzamos. Las funciones analíticas nos permiten devolver estos valores agregados conservando los datos de la fila original.
COUNT Función analítica
La descripción básica de la función analítica COUNT se muestra a continuación.
COUNT({ * | [ DISTINCT | ALL ] expr }) [ OVER (analytic_clause) ]
Omitir una cláusula de partición de la cláusula OVER significa que todo el conjunto de resultados se trata como una sola partición. En el siguiente ejemplo mostramos el número de empleados, así como todos los datos originales.
SELECT empno, ename, deptno, sal, COUNT(*) OVER () AS amount FROM emp; EMPNO ENAME DEPTNO SAL AMOUNT ---------- ---------- ---------- ---------- ---------- 7369 SMITH 20 800 14 7499 ALLEN 30 1600 14 7521 WARD 30 1250 14 7566 JONES 20 2975 14 7654 MARTIN 30 1250 14 7698 BLAKE 30 2850 14 7782 CLARK 10 2450 14 7788 SCOTT 20 3000 14 7839 KING 10 5000 14 7844 TURNER 30 1500 14 7876 ADAMS 20 1100 14 7900 JAMES 30 950 14 7902 FORD 20 3000 14 7934 MILLER 10 1300 14 SQL>
Agregar la cláusula de partición nos permite devolver el recuento dentro de una partición.
SELECT empno, ename, deptno, sal, COUNT(*) OVER (PARTITION BY deptno) AS amount_by_dept FROM emp; EMPNO ENAME DEPTNO SAL AMOUNT_BY_DEPT ---------- ---------- ---------- ---------- -------------- 7782 CLARK 10 2450 3 7839 KING 10 5000 3 7934 MILLER 10 1300 3 7566 JONES 20 2975 5 7902 FORD 20 3000 5 7876 ADAMS 20 1100 5 7369 SMITH 20 800 5 7788 SCOTT 20 3000 5 7521 WARD 30 1250 6 7844 TURNER 30 1500 6 7499 ALLEN 30 1600 6 7900 JAMES 30 950 6 7698 BLAKE 30 2850 6 7654 MARTIN 30 1250 6 SQL>