web-dev-qa-db-ja.com

OracleのCaseステートメントに基づいてGroup Byを使用するにはどうすればよいですか?

Oracle CASEを使用して日付列がより小さいまたはより大きい現在の日付であるかどうかを比較するSQLクエリがあります。しかし、どのようにCASE- statementを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。助言がありますか?

12
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)
14
paul

インラインビューを使用します。

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;

それが役に立てば幸い...

12
Ollie

追加の入力として、このスレッドには関係ありませんが、group by句で言及せずにcaseステートメントを集約することもできます。

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