Consulta SQL que devuelve el MÁXIMO de varias cuentas (grupos de edad).
Estoy tratando de terminar esta consulta para devolver solo el grupo de edad que tiene más registros:
SELECT
COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 18 AND 29 THEN a.Data_Nasc END) AS '18-29',
COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 30 AND 39 THEN a.Data_Nasc END) AS '30-39',
COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 40 AND 49 THEN a.Data_Nasc END) AS '40-49',
COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 50 AND 59 THEN a.Data_Nasc END) AS '50-59',
COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) > 60 THEN a.Data_Nasc END) AS '>60'
FROM Cliente a
JOIN Encomenda b ON b.NIF_Cliente = a.NIF_Cliente
WHERE b.NIF_Inst <> 999999999
En este momento, la consulta devuelve lo siguiente:
18-29 30-39 40-49 50-59 >60
9 19 11 5 18
El grupo de edad con más registros es el de 30-39, por lo que sería aquel que se desea devolver.
¿Alguien puede ayudar a encontrar el mejor método para resolver esto?
davy.ai
Para devolver solo el grupo de edad con la mayoría de los registros, puedes usar la función
MAX
en combinación con una subconsulta. Aquí tienes una posible solución:Explicación:
CROSS APPLY
crea una tabla virtual de grupos de edad, con una fila por grupo.WHERE
filtra las filas para mantener solo aquellas donde la cuenta coincide con la cuenta máxima (es decir, el grupo de edad con la mayoría de los registros).Ten en cuenta que si hay varios grupos de edad con la misma cuenta máxima, la consulta devolverá todos ellos. Si deseas desempatar arbitrariamente, puedes agregar un criterio secundario de ordenación a la cláusula
ORDER BY
de la funciónMAX
.