Anuncios en tutorial de programación PLSQL

lunes, 16 de abril de 2018

Funciones de grupo en SQL (SUM, AVG, COUNT, MAX y MIN)

Las llamadas group functions o funciones de grupo son funciones que operan sobre múltiples registros de una sentencia SELECT. En este artículo hablaré sobre las funciones de grupo más comunes del SQL (en un artículo posterior también hablaré sobre las cláusulas GROUP BY y HAVING muy relacionadas con este tipo de funciones).

Funciones de grupo en SQL

Lo primero que hay que saber de las funciones de grupo es que hacen cálculos sobre un grupo de registros devolviendo un resultado único, por lo que permiten, por ejemplo, obtener totales.

Función SUM


Suponiendo que estuviésemos ante una tabla con un listado de todas las compras realizadas por una determinada empresa, la función SUM nos permitiría obtener el coste total de las mismas. La sentencia SQL sería tan simple como:
SELECT SUM(coste_compra) coste_total FROM compras;
Y una posible salida sería:
COSTE_TOTAL
-----------
    1286592

Función AVG


Otra posibilidad es que el valor que estemos buscando sea el coste medio de dichas compras, en ese caso utilizaremos la función AVG.
SELECT AVG(coste_compra) coste_medio FROM compras;
Esta función lo que hace es sumar el coste de todas las compras y dividirlo por el número total de compras realizadas. Suponiendo que los 1.286.592 euros de coste se correspondiesen con 1250 registros de compra con el valor coste_compra distinto de NULL, la salida del SELECT sería:
COSTE_MEDIO
-----------
  1029.2736
Es importante señalar que la función AVG solo considera los registros cuyo campo coste_compra tiene un valor no nulo. Es decir, la función AVG ignora los registros con valor NULL. Suponiendo que en la tabla compras tuviésemos valores del campo coste_compra con valor NULL indicando que el coste ha sido 0, la función AVG no devolvería una media real. Para que este valor fuera el real deberíamos anidar la función NVL a la función AVG:
SELECT AVG(NVL(coste_compra,0)) coste_medio FROM compras;

Función COUNT


Esta función cuenta el número de registros que satisfacen las condiciones del SELECT que estemos ejecutando. Veamos a continuación algunos ejemplos:
SELECT COUNT(*) num_registros FROM compras;

NUM_REGISTROS
-------------
         1285

SELECT COUNT(compra_id) num_compras FROM compras;

NUM_COMPRAS
-----------
       1285

SELECT COUNT(coste_compra) num_costes FROM compras;

NUM_COSTES
----------
      1250
COUNT(*) devuelve todos los registros de la tabla compras (ya que no hay ninguna condición en el SELECT), por lo que no ignora los registros con valor NULL. El resultado es el mismo que cuando utilizamos COUNT(compra_id), suponiendo que compra_id es la clave primaria de la tabla compras.

Por el contrario, vemos que COUNT(coste_compra) cuenta solo los registros cuyo coste_compra es no nulo.

Es posible añadir ambos COUNT en un mismo SELECT. Por ejemplo:
SELECT COUNT(*)            num_registros
       COUNT(coste_compra) num_costes 
  FROM compras
 WHERE compra_id >1000;
Cuya posible salida sería:
NUM_REGISTROS  NUM_COSTES
-------------  ----------
          285         260
En este caso 285 registros cumple la condición compra_id > 1000 y, de esos 285 registros, 15 tendrían el campo coste_compra a NULL.

Ahora supongamos que queremos saber el número de proveedores a los que se ha hecho una compra en los últimos 365 días. La sentencia SELECT que nos devolvería ese valor sería:
SELECT COUNT(DISTINCT proveedor_id) num_proveedores
  FROM compras
 WHERE fecha_compra >= SYSDATE-365;

NUM_PROVEEDORES
---------------
             18
Como podéis observar he utilizado la cláusula DISTINCT para que, si un mismo proveedor aparece en dos o más compras, éste se cuente una sola vez. También cabe señalar que, si el campo proveedor_id tomase un valor nulo para alguna de las compras, este registro sería excluido de la cuenta.

Funciones MAX y MIN


Estas funciones sirven para obtener los valores máximo y mínimo de un determinado campo (o de un determinado cálculo realizado sobre uno o varios campos). Estás funciones pueden utilizarse tanto en campos numéricos como en campos fecha o incluso de tipo carácter. Un posible ejemplo sería:
SELECT MAX(coste_compra) max_coste
       MIN(coste_compra) min_coste 
  FROM compras;
Cuya posible salida sería:
MAX_COSTE  MIN_COSTE
---------  ---------
 94101.17          0

0 comentarios: