Lo que se busca, es decir, básicamente, los datos para un histogram.
Tendría la edad (o rango de edad) en el eje xy la cuenta n (o frecuencia) en el eje y.
En la forma más simple, se podría simplemente contar el número de cada valor edad distinta como si ya descritos:
SELECT age, count(*)
FROM tbl
GROUP BY age
Cuando hay demasiados diferentes valores para el eje x sin embargo, uno puede querer crear grupos (o clústeres o cubos). En su caso, usted agrupa en un rango constante de 10.
Podemos evitar escribir una línea WHEN ... THEN
para cada rango - podría haber cientos si no fuera por la edad. En cambio, el enfoque de @MatthewFlaschen es preferible por las razones mencionadas por @NitinMidha.
Ahora vamos a construir el SQL ...
En primer lugar, tenemos que dividir las edades dentro del rango-grupos de 10, así:
Esto puede lograrse mediante la div Iding la columna de la edad de 10 y luego calcular el suelo del resultado:
FLOOR(age/10)
"FLOOR devuelve el mayor entero igual o menor que n" http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions067.htm#SQLRF00643
Luego tomamos el SQL original y sustituir edad con esa expresión:
SELECT FLOOR(age/10), count(*)
FROM tbl
GROUP BY FLOOR(age/10)
Esto está bien, pero no podemos ver la gama, sin embargo. En cambio, solo vemos los valores de piso calculados que son 0, 1, 2 ... n
.
Para obtener el actual límite inferior, necesitamos multiplicar con 10 de nuevo por lo que tenemos 0, 10, 20 ... n
:
FLOOR(age/10) * 10
también necesitamos que el límite superior de cada intervalo que es inferior obligado + 10 - 1 o
FLOOR(age/10) * 10 + 10 - 1
por último, se concatena tanto en una cadena como esta:
TO_CHAR(FLOOR(age/10) * 10) || '-' || TO_CHAR(FLOOR(age/10) * 10 + 10 - 1)
Esto crea '0-9', '10-19', '20-29'
etc.
Ahora nuestro SQL tiene este aspecto:
SELECT
TO_CHAR(FLOOR(age/10) * 10) || ' - ' || TO_CHAR(FLOOR(age/10) * 10 + 10 - 1),
COUNT(*)
FROM tbl
GROUP BY FLOOR(age/10)
Finalmente, se aplica un orden y alias de columna bonito:
SELECT
TO_CHAR(FLOOR(age/10) * 10) || ' - ' || TO_CHAR(FLOOR(age/10) * 10 + 10 - 1) AS range,
COUNT(*) AS frequency
FROM tbl
GROUP BY FLOOR(age/10)
ORDER BY FLOOR(age/10)
Sin embargo, en escenarios más complejos, estos rangos podrían no ser agrupados en constante trozos de tamaño 10, pero necesitan clustering dinámico. Oracle tiene funciones de histograma más avanzadas incluidas, consulte http://docs.oracle.com/cd/E16655_01/server.121/e15858/tgsql_histo.htm#TGSQL366
Créditos a @MatthewFlaschen por su enfoque; Solo expliqué los detalles.
Esta debería ser la primera y única respuesta a esta pregunta. Sin embargo, podría usar un poco más de formato. – jva
No, las sentencias CASE usan evaluación de circo corto – Einstein
¿Cómo podría la evaluación de circo corto causar un problema en esta consulta? Como los casos están ordenados y usan <=, el grupo correcto siempre se selecciona. ¿No es así? – Adrian