2012-09-20 8 views
7

Tengo un error extraño. Tengo el código SQL que se parece a:SUM() todos los resultados (sin grupo por cláusula)

SELECT 
    adverse_reaction_type_id, 
    SUM(CASE adverse_reaction_type_id WHEN 1 THEN `number` ELSE 0 END) line, 
    SUM(CASE adverse_reaction_type_id WHEN 2 THEN `number` ELSE 0 END) drug 
FROM 
    core_reports_adverse_reactions, 
    ... 
WHERE 
    ... 

Esto funciona muy bien en mi instalación de MAMP, pero no lo hace en mi servidor remoto. Supongo que hay una opción de configuración en alguna parte que impide que funcione.

Este es el error que estoy recibiendo:

Mezcla de columnas GROUP (MIN(), MAX(), COUNT(), ...) sin grupo columnas es ilegal si hay ninguna cláusula GROUP BY

sé lo que el error me está diciendo, pero el problema es que yo no quiero agrupar por cualquier cosa. Quiero obtener todos los resultados donde coincida el bit de dónde (eliminado para mayor brevedad) y luego devolver el SUM() de la columna number (como line o drug según la cláusula CASE).

Así que, esencialmente, independientemente de lo que se emparejados por la cláusula WHERE todo lo que quiero es volver consecutivas:

line | drug 
----------- 
10 | 32 

¿Hay una forma de evitar esto en absoluto? O de cualquier manera que pueda GROUP BY nothing o algo?

+1

Publicando como comentario, porque es solo una respuesta parcial: este error solo puede ocurrir si tiene habilitado el modo SQL 'ONLY_FULL_GROUP_BY' (ver [http://dev.mysql.com/doc/refman/5.6/ es/group-by-hidden-columns.html] (http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html)), por lo que la diferencia entre su instalación de MAMP y su servidor remoto podría ser simplemente que no tiene habilitado ese modo SQL en su instalación de MAMP. – ruakh

Respuesta

7

Puede GROUP POR una constante en la tabla donde ejecuta SELECT.

Por ejemplo GROUP BY NULL:

mysql> select SUM(CASE WHEN product_id = 0 THEN -1 ELSE product_id END) AS sumprod, SUM(quantity) AS sumquant FROM orders GROUP BY NULL; 
+---------+----------+ 
| sumprod | sumquant | 
+---------+----------+ 
|  4 |  8 | 
+---------+----------+ 
1 row in set (0.00 sec) 

mysql> select version(); 
+-------------+ 
| version() | 
+-------------+ 
| 5.5.25a-log | 
+-------------+ 
1 row in set (0.00 sec) 

Pero por lo general significa que este error que hay al menos una columna que es no agrupados.

Es posible que la versión de producción de MySQL se sorprenda por el uso de un CASE dentro de la función de agregado.

+0

ah, veo lo que quieres decir, y eso hace que el error tenga sentido. En realidad, había reducido la enorme consulta sql para hacerlo más legible y había eliminado algunas columnas de "selección" pensando que no eran relevantes. He reeditado la pregunta, pero ahora saqué ese campo 'id' de mi consulta principal y funciona bien. :) ¡Gracias! –

+0

Lo aceptaré cuando pueda;) –

+0

No es una constante. No puede ser un número entero. –

Cuestiones relacionadas