martes, 5 de mayo de 2015

Ejemplos con Having en Oracle

Les comento que un compañero de mi trabajo toma un examen de Oracle / PLSQL a los que pasaron todas las pruebas previas (psicotécnico, razonamiento, etc). Pero he aquí la diferencia varios no saben usar esta sintaxis, su tipo pregunta es: Tengo 2 entidades Persona y Documentos, calcula las personas con más de un documento.

Para comenzar vamos a los conceptos:

  • Having es usando conjuntamente con GROUP BY.
  • Funciones que se puede combinar:
    1. SUM: Cuando requieras agrupar por cantidades que se acumulan y suman.
    2. COUNT: Cuando quieras buscar cantidades de registros sin sumar.
    3. MIN: Cuando requieras todos los registros mínimos a su valor.
    4. MAX: Cuando requieras todos los registros mínimos a su valor.

Vamos con unos ejemplos, tenemos la siguiente tabla simple:



1.- SUM: Queremos obtener la suma de total de temperatura por cada ciudad, lo podemos hacer con el siguiente query;

SELECT ciudad, SUM(temperatura) from
muestras GROUP BY ciudad HAVING SUM(temperatura);


Y si queremos sólo los que cumples que tengan más de 50 de total sumado de temperatura sólo le agregamos al final:
SELECT ciudad, SUM(temperatura) from
muestras GROUP BY ciudad HAVING SUM(temperatura)>50;


2.- COUNT: Si quisiéramos saber cuantas veces se repite cada registro sólo hacemos la siguiente consulta:


SELECT ciudad, COUNT(temperatura) from muestras GROUP BY ciudad HAVING COUNT(temperatura);



Ahora si queremos sólo las que tienen registros mayores a 2, esta es la consulta:

SELECT ciudad, COUNT(temperatura) from
muestras GROUP BY ciudad HAVING COUNT(temperatura)>2;



3.- MAX y MIN: Si quisiéramos saber cuanto es el máximo de cada uno de los registros pero no repetidos hacemos la siguiente consulta:



SELECT ciudad, MAX(temperatura) FROM muestras
  GROUP BY ciudad HAVING MAX(temperatura);



Ahora si sólo queremos los mayores a 16 haríamos lo siguiente:
SELECT ciudad, MAX(temperatura) FROM muestras  GROUP BY ciudad HAVING MAX(temperatura)>16;


Para mínimo es la misma lógica.

Ahora se atreven a dar el examen y dar un respuesta? Espero esté todo claro. Espero verlos muy pronto.



PD: La misma idea funciona para la base de datos MySQL.
El código de la tabla y registro es el siguiente:
CREATE TABLE  `muestras` (
  `ciudad` varchar(40) DEFAULT NULL,
  `fecha` date DEFAULT NULL,
  `temperatura` number(4) DEFAULT NULL
) ;
INSERT INTO `muestras` (`ciudad`, `fecha`, `temperatura`) VALUES
('Madrid', '2005-03-17', 23),
('París', '2005-03-17', 16),
('Berlín', '2005-03-17', 15),
('Madrid', '2005-03-18', 25),
('Madrid', '2005-03-19', 24),
('Berlín', '2005-03-19', 18);