2012-07-04 19 views
6

veya tarihinden daha büyük bir tarih sütunun 'dan daha küçük olup olmadığını karşılaştırmak için Oracle CASE'u kullandığım bir SQL sorgum var. Ancak bu CASE -statement'i GROUP BY -statement'te nasıl kullanırım? Her durumda kayıtları saymak istiyorum.Oracle'da bir Case deyimine dayanarak Group By'ı nasıl kullanırım?

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 

Bunu denerken bir hatayla karşılaşıyorum: ORA-00904. Baska öneri? Bu konuya ilgili değildir rağmen ayrıca vaka ifadeleri topaklaşabilir, ek bir girdi olarak

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; 

Umarım yardımcı olur ...

+1

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

cevap

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

Performans açısından in-line görünümünde ne fark var? – Donatello

+1

Emin değilim. Oracle'ın "CASE" değerini iki kere değerlendirip değerlendirmediğine bağlı olur. 'EXPLAIN PLAN' kullanarak kontrol edebilirsiniz. Her halükarda, arka görüş ile, yinelenen mantık olmadan SQL'in daha iyi göründüğünü düşündüğümden, muhtemelen @Ollie cevabı ile giderdim. – paul

12

bir satır içi görünümünü kullanma Gruptaki ifadeden bahsetmeden.

WORK_ORDER_NUMBER, SUM SELECT (ÖRNEK DAHA SONRA STOCK_CODE LIKE 'xxxx' STOCK_QUANTITY ELSE 0 END) WORK_ORDER_NUMBER Tablo GRUBUNDAN TOPLAM;

Lütfen, JK.