2012-07-04 8 views
6

Mam zapytanie SQL, w którym używam Oracle CASE, aby porównać, czy kolumna z datą jest mniejsza niż lub większa niż aktualna data. Ale w jaki sposób mogę użyć tej CASE -zakresu w GROUP BY? Chciałbym policzyć zapisy w każdym przypadku.Jak korzystać z Group By na podstawie instrukcji Case w 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 

Ale pojawia się błąd podczas próby: ORA-00904. Jakieś sugestie?

+1

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

Odpowiedz

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

jaka jest różnica z widokiem w linii pod względem wydajności? – Donatello

+1

Nie jestem pewien. Zależy od tego, czy oracle ocenia dwukrotnie "CASE". Możesz to sprawdzić za pomocą 'EXPLAIN PLAN'. W każdym razie, z perspektywy czasu, prawdopodobnie pójdę z odpowiedzią @Oie, ponieważ myślę, że SQL wygląda lepiej bez powielonej logiki – paul

12

Użyj widoku inline:

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; 

nadzieję, że to pomaga ...

0

Jako dodatkowe wejścia, choć nie odnosi się do tego wątku, można również agregować swoje wypowiedzi przypadków nie wspominając o tym w klauzuli group by.

SELECT WORK_ORDER_NUMBER, SUMA (przypadek, gdy STOCK_CODE LIKE 'XXX', a następnie STOCK_QUANTITY ELSE 0 KONIEC) jako całkowity z tabeli GROUP BY WORK_ORDER_NUMBER;

Uprzejmie, JK.