Как использовать Group By на основе оператора Case в Oracle?

у меня есть SQL-запрос, где я использую Oracle CASE для сравнения, если столбец дата составляет меньше или больше текущей даты. Но как я использую это CASE-инструкция GROUP BY-заявление? Я бы хотел пересчитать записи по каждому делу.

Э. Г.

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

но я получаю ошибку при попытке этого:ORA-00904. Есть предложения?

3 ответов


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)

используйте встроенный вид:

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;

надеюсь, что это помогает...


в качестве дополнительного ввода, хотя он не относится к этому потоку, вы также можете агрегировать свои операторы case, не упоминая его в предложении group by.

SELECT
   WORK_ORDER_NUMBER,
   SUM(CASE WHEN STOCK_CODE LIKE 'xxxx' THEN STOCK_QUANTITY ELSE 0 END) AS TOTAL
FROM Table
GROUP BY WORK_ORDER_NUMBER;