web-dev-qa-db-fra.com

Comment utiliser Group By en fonction d'une instruction de cas dans Oracle?

J'ai une requête SQL où j'utilise Oracle CASE pour comparer si une colonne de date est inférieur à ou supérieur à date actuelle Mais comment utiliser cette instruction CASE- dans une instruction GROUP BY-? J'aimerais compter les enregistrements dans chaque cas.

Par exemple.

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

Mais je reçois une erreur en essayant ceci: ORA-00904. Aucune suggestion?

10
Jonas
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)
13
paul

Utilisez une vue en ligne:

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;

J'espère que ça aide...

12
Ollie

En tant qu'entrée supplémentaire, bien que cela ne soit pas lié à ce fil, vous pouvez également agréger vos déclarations de cas sans le mentionner dans la clause 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;
0
JayKayOf4