2012-07-04 36 views
6

Tôi có truy vấn SQL nơi tôi sử dụng Oracle CASE để so sánh nếu cột ngày là nhỏ hơn hoặc lớn hơn ngày hiện tại. Nhưng làm cách nào để tôi sử dụng số CASE trong một mã số GROUP BY? Tôi muốn đếm các hồ sơ trong từng trường hợp.Làm cách nào để sử dụng Group By dựa trên tuyên bố Case trong Oracle?

Ví dụ:

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

Nhưng tôi gặp lỗi khi thử cách này: ORA-00904. Bất kỳ đề xuất?

+1

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

Trả lời

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

sự khác biệt với chế độ xem nội dòng về mặt biểu diễn là gì? – Donatello

+1

Tôi không chắc chắn. Sẽ phụ thuộc vào việc oracle đánh giá 'CASE' hai lần. Bạn có thể kiểm tra bằng cách sử dụng 'EXPLAIN PLAN'. Trong mọi trường hợp, với nhận thức muộn, tôi có thể đi với câu trả lời @Ollie, vì tôi nghĩ rằng SQL trông đẹp hơn mà không có logic trùng lặp – paul

12

Sử dụng một cái nhìn 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; 

Hy vọng nó sẽ giúp ...

0

Là một đầu vào bổ sung, mặc dù nó không liên quan đến chủ đề này, bạn cũng có thể tổng hợp báo cáo trường hợp của bạn mà không đề cập đến nó trong nhóm theo mệnh đề.

CHỌN WORK_ORDER_NUMBER, SUM (CASE KHI STOCK_CODE LIKE 'xxxx' THEN ELSE STOCK_QUANTITY 0 END) AS TỔNG TỪ Bảng GROUP BY WORK_ORDER_NUMBER;

Vui lòng, JK.

Các vấn đề liên quan