jueves, 4 de febrero de 2016

GROUP BY, HAVING, MAX, MIN en SQL Server

MAX

Buenos días queridos lectores, el día de hoy veremos el uso de MAX y MIN en SQL SERVER combinadas con GROUP BY, espero que este artículo sea de utilidad.

La función MAX permite determinar el valor máximo de una expresión propuesta por el usuario

Sintaxis
MAX(All o Columna o Expresión)

Donde:

  • ALL: Específica que todos los valores son evaluados. Muchas veces no se coloca ALL por ser un parámetro determinado
  • Columna: se puede especificar el nombre de una columna de una tabla a buscar el mayor valor
  • Expresión: Representa una función SQL o a un juego de operadores aritméticos
MAX solo puede ser usado con columnas o expresiones que tengas como tipo un entero, caso contrario generará un error proveniente desde el motor de Base de Datos.

Vamos a mostrar algunos ejemplos

Ejemplo1:
Script que permita mostrar el monto más alto registrado en la tabla PAGO



SELECT MAX(P.MONTO) AS [MONTO MAS ALTO]
       FROM PAGO P
GO

En el script se implementa la función MAX que permite determinar el máximo valor ingresado en la columna P.MONTO que pertenece a la tabla PAGO


Ejemplo 2:
Script que permita mostrar lo montos más altos por año ordenados por años en forma descendente desde la tabla PAGO.

SELECT YEAR(FECHA) AS [AÑO], MAX(P.MONTO) AS [MONTO MAS ALTO]
       FROM PAGO P
       GROUP BY YEAR(FECHA)
       ORDER BY YEAR(FECHA) DESC
GO

En el script se necesita obtener el mayor monto registrado por año, la función MAX(P.MONTO) determina el monto mas alto de acuerdo a la agrupación especificada en GROUP BY
Ejemplo 3:
Script que permita mostrar los datos del pasajero que registra el mayor monto desde la tabla PAGO

DECLARE @MAXIMO INT
SELECT @MAXIMO=MAX(MONTO) FROM PAGO

SELECT PAS.*
       FROM PASAJERO PAS
       WHERE PAS.IDPASAJERO=(SELECT IDPASAJERO
                                                      FROM PAGO WHERE MONTO=@MAXIMO)
GO

En el script se declara la variable @MAX que permitirá obtener el mayot valor registrado en la tabla PAGO. Para luego ser parte de la condición de una segunda consulta. Se necesita almacenar dicho valor en la variable, eso se logra con el siguiente script SELECT @MAXIMO=MAX(MONTO) donde el máximo valor se asigna a la variable @MAXIMO.

En la segunda parte de la implementación se realiza el reporte de los pasajeros con SELECT PAS.* solo si el IDPASAJERO es igual a IDPASAJERO que contiene el mayor monto desde la tabla PAGO; esto se logra gracias a la subconsulta aplicada a dicha columna.

Hay que tener en cuenta que el script solo funcionará si el valor mayor encontrado en la tabla PAGO es un único valor, esto quiere decir que si se registran varios pagos con el más alto monto idénticos entonces generará un error desde el motor de base de datos ya que debe recordar que toda subconsulta espera devolver un valor, pero en este caso ocurriría que la subconsulta devolvería más de un IDPASAJERO; entonces no sería recomendado usar subconsultas, sino INNER JOIN. El resultado de la consulta queda como sigue:
Ejemplo 4:
Script que permita mostrar los datos de los pasajeros que registran el mayor y menor monto desde la tabla PAGO

DECLARE @MAXIMO INT, @MINIMO INT
SELECT @MAXIMO=MAX(MONTO), @MINIMO=MIN(MONTO) FROM PAGO

SELECT PAS.*, PAG.MONTO, 'MONTO MÁXIMO' AS [CONDICION]
       FROM PASAJERO PAS
       INNER JOIN PAGO PAG ON PAS.IDPASAJERO=PAG.IDPASAJERO
       WHERE PAG.MONTO=@MAXIMO
UNION
SELECT PAS.*, PAG.MONTO, 'MONTO MINIMO' AS [CONDICION]
       FROM PASAJERO PAS
       INNER JOIN PAGO PAG ON PAS.IDPASAJERO=PAG.IDPASAJERO
       WHERE PAG.MONTO=@MINIMO
GO

El Script declara dos variables: una para capturar el valor máximo de los montos y otro para el menos. Se le asigna valores desde una misma consulta a ambas variables.

Luego se unen las dos tablas por la clausula INNER JOIN y condicionando que la columna MONTO de la tabla PAGO sea igual al mayor asignado a la variable @MAXIMO

El operador UNION permite unir dos consultas en una sola, pero con la restricción de que el número de campos de ambas tablas sean de la misma cantidad.

Se adicionó la columna MONTO proveniente de la tabla PAGO y la columna CONDICION preparada exclusivamente para mostrar cuál es la condición del monto mostrado, es decir, si el monto, es el máximo o el mínimo.

La siguiente imagen muestra el resultado de la consulta:


Ejemplo 5:
Script que permita mostrar los datos del país que registra el más alto número de pasajeros registrados utilizando funciones agregadas y subconsultas

DECLARE @MAXIMO INT
SELECT @MAXIMO = MAX(TOTAL)
       FROM (SELECT PAI.PAIS, COUNT(*) AS TOTAL
                           FROM PASAJERO PAS
                           INNER JOIN PAIS PAI ON PAS.IDPAIS=PAI.IDPAIS
                           GROUP BY PAI.PAIS) X

SELECT PAI.PAIS, COUNT(*) AS TOTAL
       FROM PASAJERO PAS
       INNER JOIN PAIS PAI ON PAS.IDPAIS=PAI.IDPAIS
       GROUP BY PAI.PAIS
       HAVING COUNT(*)=@MAXIMO
GO

--------------------------

SELECT PAI.PAIS, COUNT(*) AS TOTAL
       FROM PASAJERO PAS
       INNER JOIN PAIS PAI ON PAS.IDPAIS=PAI.IDPAIS
       GROUP BY PAI.PAIS
       HAVING COUNT(*)=(
                                  SELECT MAX(TOTAL)
                                  FROM (SELECT PAI.PAIS, COUNT(*) AS TOTAL
                                               FROM PASAJERO PAS
                                               INNER JOIN PAIS PAI
                                               ON PAS.IDPAIS=PAI.IDPAIS
                                               GROUP BY PAI.PAIS
                                  ) X
                           )
GO

Se muestran dos scripts que producen el mismo resultado, el resultado de cualquiera de esos dos scripts seria el siguiente:


Hasta aquí el post queridos lectores, espero haya sido de utilidad, espero comenten, compartan, den +1 o hagan clic en alguna publicidad de su interés.

Saludos. ¡Un abrazo!





Banderas de Visitantes

Flag Counter