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!
hola,
ResponderBorrartengo una tabla donde me sale en una columna los id, en otra columna los valores y en otra columna las fechas. y deseo crear una una columna donde me de el valor de la ultima fecha por cada id.
sabrías como?
saludos
Busca información sobre la sentencia partition by
Borrar