2012-09-20 12 views
7

Ho uno strano errore. Ho codice SQL che assomiglia a:SUM() tutti i risultati (nessuna clausola group by)

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 
    ... 

Questo funziona bene sulla mia installazione MAMP, ma non lo fa sul mio server remoto. Presumo che ci sia un'opzione di configurazione da qualche parte che gli impedisca di funzionare.

Questo è l'errore che sto ricevendo:

miscelazione di colonne GROUP (MIN(), MAX(), COUNT(), ...), con nessun gruppo colonne è illegale se non v'è nessuna clausola GROUP bY

so che cosa l'errore mi sta dicendo, ma il problema è che io non voglio al gruppo da nulla. Voglio ottenere tutti i risultati dove il bit where (rimosso per brevità) corrisponde e quindi restituire il SUM() della colonna number (come line o drug in base alla clausola CASE).

Quindi, in sostanza, a prescindere da ciò che è abbinati dal WHERE clausola di tutto quello che voglio è tornare fila:

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

C'è un modo per aggirare questo a tutti? O in qualsiasi modo posso GROUP BY nothing o qualcosa del genere?

+1

Pubblicare come commento, perché è solo una risposta parziale: questo errore può verificarsi solo se è attiva la modalità SQL "ONLY_FULL_GROUP_BY' (vedere [http://dev.mysql.com/doc/refman/5.6/ en/group-by-hidden-columns.html] (http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html)), quindi la differenza tra l'installazione MAMP e il tuo server remoto potrebbe essere semplicemente che non hai abilitato questa modalità SQL nell'installazione di MAMP. – ruakh

risposta

7

È possibile GROUP DA una costante sul tavolo in cui si esegue il SELECT.

Ad esempio 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) 

Ma solito questo errore significa che c'è almeno una colonna quali è non raggruppati.

È possibile che la versione di produzione di MySQL sia presa di sorpresa dall'utilizzo di un CASE nella funzione di aggregazione.

+0

ah, capisco cosa intendi, e questo fa sì che l'errore abbia senso. Avevo effettivamente abbattuto la query sql di HUGE per renderlo più leggibile e ho rimosso alcune colonne "selezionate" pensando che non fossero rilevanti. Ho rieditato la domanda, ma ora ho tolto il campo 'id' dalla mia query principale e funziona perfettamente! :) Grazie! –

+0

Accetterò quando posso;) –

+0

Non è una costante. Non può essere un numero intero. –