2012-07-04 4 views
6

Ho una query SQL in cui utilizzo Oracle CASE per confrontare se una colonna di data è inferiore a o maggiore di data corrente. Ma come faccio a utilizzare questo CASE -statement in un documento GROUP BY? Mi piacerebbe contare i record in ogni caso.Come si utilizza Raggruppa in base a un'istruzione Case in Oracle?

E.g.

select 
    (case 
     when exp_date > sysdate then 1 
     when exp_date <= sysdate then 2 
     else 3 
    end) expired, count(*) 
from mytable 
group by expired 

ma ottengo un errore quando prova questo: ORA-00904. Eventuali suggerimenti?

+1

http://stackoverflow.com/questions/268429/group-by-alias-oracle – manurajhada

risposta

9
select 
(case 
    when exp_date > sysdate then 1 
    when exp_date <= sysdate then 2 
    else 3 
end) expired, count(*) 
from mytable 
group by (case 
    when exp_date > sysdate then 1 
    when exp_date <= sysdate then 2 
    else 3 
end) 
+0

quale differenza con la visualizzazione in linea in termini di prestazioni? – Donatello

+1

Non ne sono sicuro. Dipenderebbe dal fatto che oracle valuti due volte il 'CASE'. Puoi controllare usando 'EXPLAIN PLAN'. In ogni caso, con il senno di poi, probabilmente andrei con la risposta di @Ollie, poiché penso che l'SQL sembri migliore senza la logica duplicata – paul

12

Utilizzare una vista in linea:

SELECT expired, 
     count(*) 
    FROM (SELECT (CASE 
        WHEN exp_date > SYSDATE THEN 1 
        WHEN exp_date <= SYSDATE THEN 2 
        ELSE 3 
       END) AS expired 
      FROM mytable) 
GROUP BY expired; 

Speranza che aiuta ...

0

Come un ingresso aggiuntivo, anche se non si riferisce a questa discussione, è anche possibile aggregare le sue dichiarazioni di casi senza menzionarlo nel gruppo per clausola.

SELEZIONA WORK_ORDER_NUMBER, SUM (CASO QUANDO STOCK_CODE LIKE 'xxxx' ALLORA STOCK_QUANTITY ELSE 0 END) AS TOTALE FROM Tabella GROUP BY WORK_ORDER_NUMBER;

Gentilmente, JK.

Problemi correlati