2009-10-05 8 views
96

sto ottenendo ORA-00979 con la seguente query:ORA-00979 non un gruppo da un'espressione

SELECT cr.review_sk, cr.cs_sk, cr.full_name, 
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt", 
cs.cs_id, cr.tracking_number 
from review cr, cs, fact cf 
where cr.cs_sk = cs.cs_sk 
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%' 
and row_delete_date_time is null 
and cr.review_sk = cf.review_wk (+) 
and cr.fact_type_code (+) = 183050 
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number 
ORDER BY cs.cs_id, cr.full_name; 

non ho trovato nessun esempi che aveva sia GROUP BY e ORDER BY nella stessa query. Ho provato a rimuovere ogni campo dal gruppo di uno alla volta, ma sto ancora ricevendo lo stesso errore.

risposta

166

è necessario inserire tutte le colonne della SELECT nei GROUP BY o utilizzare le funzioni di loro che comprimono i risultati in un singolo valore (come MIN, MAX o SUM).

Un semplice esempio per capire il motivo per cui questo accade: Immaginate di avere una base di dati come questo:

FOO BAR 
0 A 
0 B 

e si esegue SELECT * FROM table GROUP BY foo. Ciò significa che il database deve restituire una singola riga come risultato con la prima colonna 0 per soddisfare lo GROUP BY ma ora ci sono due valori di bar tra cui scegliere. Quale risultato ti aspetti: A o B? O il database dovrebbe restituire più di una riga, violando il contratto di GROUP BY?

+0

anche quelli che sono nella clausola ORDER BY? Non ho quei due nel mio GROUP BY. – Theresa

+6

No, non è necessario inserirli nell'ordine in base alla clausola – Xaisoft

+2

Ho provato ad aggiungere le due colonne in ORDER BY a GROUP BY. Ha funzionato. Grazie! – Theresa

13

Includere nella clausola GROUP BY tutte le espressioni SELECT che non sono argomenti di funzione di gruppo.

2

Peccato che Oracle abbia limitazioni come queste. Certo, il risultato per una colonna non nel gruppo BY sarebbe casuale, ma a volte lo vuoi. Silly Oracle, puoi farlo in MySQL/MSSQL.

ma c'è un lavoro in giro per Oracle:

Mentre la seguente riga non funziona

SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A; 

si può ingannare Oracle con alcuni 0 di come il seguente, per mantenere la colonna nel campo di applicazione , ma non gruppo da essa (assumendo questi sono numeri, altrimenti utilizzare CONCAT)

SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt 
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A); 
+0

@GlennFromIowa dato il mio pseudo tavolo non è rigorosamente definito sopra, e che non lavoro più per un'azienda con 11g, non posso fornire un esempio migliore, anche se è stato un problema quando l'ho testato l'ultima volta. –

+1

Solo per curiosità, qual è un esempio di quando si vorrebbe un risultato casuale? Non riesco a pensare a nessuna ragione per cui vorresti raggruppare per FOO e ottenere una riga casuale per BAR. –

1

Il gruppo per viene utilizzato per aggregare così me dati, a seconda della funzione di aggregazione, e diversi da quello che è necessario mettere colonna o colonne a cui è necessario il raggruppamento.

ad esempio:

select d.deptno, max(e.sal) from emp e, dept d where e.deptno = d.deptno group by d.deptno;

Questo si tradurrà nei dipartimenti salario massimo.

Ora se omettiamo il d.deptno dalla clausola group by darà lo stesso errore.

1

Si dovrebbe fare il seguente:

SELECT cr.review_sk, 
     cr.cs_sk, 
     cr.full_name, 
     tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt", 
     cs.cs_id, 
     cr.tracking_number 
from review cr, cs, fact cf 
where cr.cs_sk = cs.cs_sk 
     and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%' 
     and row_delete_date_time is null 
     and cr.review_sk = cf.review_wk (+) 
     and cr.fact_type_code (+) = 183050 
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name 
ORDER BY cs.cs_id, cr.full_name; 
0

stesso errore anche venire quando SUPERIORE o INFERIORE parola chiave non utilizzato sia posto in select espressione e di gruppo per l'espressione.

Sbagliato: -

select a , count(*) from my_table group by UPPER(a) . 

destra: -

select UPPER(a) , count(*) from my_table group by UPPER(a) . 
1

Se tentoni in virtù di includere GROUP BY clausola, qualsiasi espressione in SELECT, che non è funzione di gruppo (o funzione aggregata o colonna aggregata) come COUNT, AVG, MIN, MAX, SUM e così via (List of Aggregate functions) devono essere presenti nella clausola GROUP BY.

Esempio (modo corretto) (qui employee_id non è funzione di gruppo (colonna non aggregate), quindi must appaiono in GROUP BY. Al contrario, la somma (stipendio) è una funzione di gruppo (colonna aggregati), quindi non è richiesto di apparire nella clausola GROUP BY.

SELECT employee_id, sum(salary) 
    FROM employees 
    GROUP BY employee_id; 

Esempio (modo sbagliato) (qui employee_id non è funzione gruppo e non risulta in GROUP BY clausola, che porterà alla ORA-00979 Errore

SELECT employee_id, sum(salary) 
    FROM employees; 

Per correggere quello che devi fare uno delle seguenti operazioni:

  • Includere tutte le espressioni non aggregate elencati SELECT clausola nella clausola GROUP BY
  • gruppo
  • Rimuovere funzioni (aggregato) dalla clausola SELECT.