2010-05-26 18 views
21

Tengo una tabla de cuentas y una tabla de registros donde las cuentas tienen múltiples registros. Me gustaría desglosar los totales de la cuenta por rango de "conteo de registros". Es decir. Mostrar el desglose deMySQL y CASO CUANDO con un rango de valores

Count of Records | Count 
========================= 
0-25 | 100 
25 - 50 | 122 
50 - 100 | 300 

Etc.

estoy usando la siguiente consulta, pero no puedo conseguirlo para agrupar por "GRP", que es lo que quiero, cualquier ayuda en la mejor manera de modificar consulta?

SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id 
    ORDER BY ct 

Respuesta

19

intente esto:

SELECT count(*) as ct, 
CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' 
END AS grp 
FROM records r, accounts a 
WHERE r.account_id=a.id 
GROUP BY r.account_id, a.id, 
    CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' END 
ORDER BY count(*) 

usted tiene que "definir" los "cubos" que desea agregar las filas de datos originales en ... Esto es lo que la cláusula GROUP BY es para .. Define los criterios por los cuales se analizará cada fila en las tablas base para determinar en qué "cubo" se agregarán sus datos ... La expresión o expresiones definidas en la cláusula group by son las "definiciones" para esos segmentos.

A medida que la consulta procesa las filas de datos originales, cualquier fila para la que los valores de esta expresión (s) son los mismos que una categoría existente se agrega a esa categoría ... Cualquier nueva fila con un valor no representada por una cubeta existente hace que se cree una nueva cubeta ...

+2

me sale ERROR 1111 (HY000): Uso no válido de función de grupo estoy usando MySQL 5.1 Gracias! – kickdaddy

+0

Disculpe, como está utilizando las columnas 'r.Account_id' y' a.id' en la parte principal de la consulta sql, debe incluir también aquellas en la cláusula By del grupo ... Cada columna o expresión referida t9o en la parte principal (preagregación) de la consulta que no es una función de agregación (Suma, Promedio, Mín., Máx., etc.) debe mencionarse en la cláusula By del grupo. –

+0

No veo cómo puede usar un COUNT (*) dentro de una cláusula GROUP BY. ¿Esto es posible? –

6

Necesita una sub consulta. Si esta es una vista, entonces necesita usar dos vistas.

SELECT s.ct, s.grp FROM ( 
SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 AND COUNT(*) < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 AND COUNT(*) < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 AND COUNT(*) < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 AND COUNT(*) < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 AND COUNT(*) < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id) as s 

Group BY s.grp; 
Cuestiones relacionadas