Salta el contingut

Consultes avançades - COUNT, DISINCT, IFNULL - NVL

COUNT

  • La funció de grup COUNT retorna el nombre de valors NOT NULL d’una columna.

    SELECT COUNT(EMPLOYEE_ID),
        COUNT(DEPARTMENT_ID),
        COUNT(COMMISSION_PCT)
    FROM EMPLOYEES;
    +--------------------+----------------------+-----------------------+
    | COUNT(EMPLOYEE_ID) | COUNT(DEPARTMENT_ID) | COUNT(COMMISSION_PCT) |
    +--------------------+----------------------+-----------------------+
    |                 20 |                   19 |                     4 |
    +--------------------+----------------------+-----------------------+
    
  • La funció de grup COUNT(*) retorna el nombre de files d’una taula o consulta.

    SELECT COUNT(*)
    FROM EMPLOYEES;
    +----------+
    | COUNT(*) |
    +----------+
    |       20 |
    +----------+
    
  • Utilitzem COUNT(*) quan volem comptar totes les files, fins i tot les duplicades, així com les que tinguin valors NULs.

COUNT DISTINCT

La paraula DISTINCT la utilitzem per a retornar valors no duplicats.

Podem usar la paraula DISTINCT dins una funció d’agrupament, sovint COUNT(*), per a comptabilitzar només els valors no duplicats.

SELECT COUNT(*), COUNT(DISTINCT  JOB_ID),
                 COUNT(DISTINCT DEPARTMENT_ID)
FROM EMPLOYEES;
+----------+-------------------------+-------------------------------+
| COUNT(*) | COUNT(DISTINCT  JOB_ID) | COUNT(DISTINCT DEPARTMENT_ID) |
+----------+-------------------------+-------------------------------+
|       20 |                      12 |                             7 |
+----------+-------------------------+-------------------------------+

A la consulta anterior podem dir que:

  • tenim 20 empleats a la taula EMPLOYEES,

  • d'aquests hi ha 12 tipus de JOB_ID diferents

  • aquests treballen en 7 departaments (DEPARTMENT_ID) diferents

També podem usar la paraula DISTINCT dins d’altres funcions d’agrupament.

SELECT COUNT(COMMISSION_PCT) Q,
       AVG(COMMISSION_PCT) AVG,
       AVG(DISTINCT COMMISSION_PCT) AVG_DISTINCT
FROM EMPLOYEES;
+---+----------+--------------+
| Q | AVG      | AVG_DISTINCT |
+---+----------+--------------+
| 4 | 0.212500 |     0.216667 |
+---+----------+--------------+

En aquest cas estem veient la mitjana dels diferents tipus de commissió, no de totes les comissions.

SELECT SUM(SALARY) SOUs,
       SUM(DISTINCT SALARY) SOUs_DISTINCT
FROM EMPLOYEES;
+-----------+---------------+
| SOUs      | SOUs_DISTINCT |
+-----------+---------------+
| 175500.00 |     152500.00 |
+-----------+---------------+

En aquest cas estem veient la mitjana dels diferents sous, no de tots els sous.

IFNULL / NVL en funcions de grup

De vegades voldrem incloure valors NO NULs en les funcions de grup.

En aquest cas podem utilitzar la funció IFNULL o NVL dins de la funció de grup.

SELECT AVG(COMMISSION_PCT),
       AVG(IFNULL(COMMISSION_PCT, 0))
FROM EMPLOYEES;
+---------------------+--------------------------------+
| AVG(COMMISSION_PCT) | AVG(IFNULL(COMMISSION_PCT, 0)) |
+---------------------+--------------------------------+
|            0.212500 |                       0.042500 |
+---------------------+--------------------------------+

D'aquesta manera estem obligant a comptar, dins la mitjana, els empleats que no van a comissió, com si la seva comissió fos zero.