2012-07-04 115 views
6

Tengo una consulta SQL donde uso Oracle CASE para comparar si una columna de fecha es menos de o mayor que fecha actual. ¿Pero cómo uso esa declaración CASE en una declaración GROUP BY? Me gustaría contar los registros en cada caso.¿Cómo uso Group By en base a una declaración Case en 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 

pero me da un error al intentar esto: ORA-00904. ¿Alguna sugerencia?

+1

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

Respuesta

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

¿Cuál es la diferencia con la vista en línea en términos de rendimiento? – Donatello

+1

No estoy seguro. Dependería de si el oráculo evalúa el 'CASO' dos veces. Puede verificar usando 'EXPLICAR PLAN '. En cualquier caso, en retrospectiva, probablemente vaya con la respuesta @Ollie, ya que creo que el SQL se ve mejor sin la lógica duplicada – paul

12

Utilice una vista en línea:

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; 

creo que sirve ...

0

Como una entrada adicional, aunque no se refiere a este tema, también se puede agregar a sus declaraciones de caso sin mencionarlo en el grupo por cláusula.

SELECT WORK_ORDER_NUMBER, SUM (CASE CUANDO STOCK_CODE LIKE 'xxxx', entonces STOCK_QUANTITY ELSE 0 END) como Total DE Tabla GROUP BY WORK_ORDER_NUMBER;

Amablemente, JK.