Función analítica COUNT

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>

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *