こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SELECT文内での条件分岐

すみませんが、ご指導お願いします。

ACCESS97+ORACLEを用いまして、データベースを操作するのを作成しています。
うまくいかなく立ち止まってしまいました。

パススルークエリを使用し、SELECT文内部の1項目内にcase文を使用して、値をだしたいのですが。

内容ですが:
条件項目のところ:
(1)販売数が0のものは0とし
(2)日当数/在庫数が1以下のものは、1とし
(3)それ以外は、(日当数/在庫数)+0.9
上記の各それぞれでだされた値に「在庫数」をかける。

SELECT 商品コード,在庫数,販売数,販売数/稼動日 AS 日当数,(CASE WHEN 販売数=0 THEN 0 ELSE (日当数/在庫数) < 1 THEN 1 ELSE (日当数/在庫数)+0.9 END) END) * 在庫数

select文自体がcase文はできないのか、もし可能でしたら、自分の構文が何が悪いのか、ご指導お願い致します。

投稿日時 - 2004-11-23 22:00:58

QNo.1097391

すぐに回答ほしいです

質問者が選んだベストアンサー

Oracle8.0.xでは、case文は使えません。
Oracle8.1.xで、拡張された機能です。

古いオラクルでは、case文でなく、decode関数で
勝負します。

select
商品コード,
在庫数,
販売数,
販売数 / 稼働日 as 日当数,
decode(販売数,0,
decode(sign(販売数 / 稼働日 / 在庫数) - 1,-1,1,
販売数 / 稼働日 / 在庫数 + 0.9)) * 0.9
from hoge
;

投稿日時 - 2004-11-24 17:55:38

お礼

ご回答ありがとうございます。
おかげさまで目的が果たせました。
今回はOracleについてもとても勉強になりました。
また、機会があればお願い致します。

投稿日時 - 2004-11-24 20:18:02

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(4)

>構文を確認してやってみました。
>確認後、CASE文のところに()を通常つけるのでしょうか?

サブクエリと違うので、()は不要です。

最初に書きましたが、Oracleのバージョンによって、
case文の取り扱いに差があります。
バージョンは何ですか?

FROMが無いといわれるのは、Oracleのバージョンの問題か
コーディングミス(カンマの過不足)のいずれかの可能性が
高いです。

投稿日時 - 2004-11-24 16:06:05

補足

ご回答ありがとうございます。
ORACLEのバージョンですが、「Oracle 8 -Release 8.0.5.2.1-」になります。
現在、コーディング確認しておりますが、誤っているところはなさそうです。

お手数おかけしますが、お願い致します。

投稿日時 - 2004-11-24 16:31:36

Oracle9iであれば、case文の使用に制限がありませんが、
8iでは、一部使えない場合があるので要注意です。
(ストアドでは使えない等)

基本的にCASE文の構文がおかしいと思いますが..

select
商品コード,
在庫数,
販売数,
販売数 / 稼働日 as 日当数,
case
when 販売数=0 then 0
when (販売数 / 稼働日 / 在庫数) < 1 then 1
else 販売数 / 稼働日 / 在庫数 + 0.9
end * 0.9
from hoge
;

ような感じになると思います。

投稿日時 - 2004-11-24 10:28:00

補足

すみません。ありがとうございます。
構文を確認してやってみました。
確認後、CASE文のところに()を通常つけるのでしょうか?
SELECT 商品コード,~.....
(CASE
WHEN (A.最新当月販売予測数=0) THEN 0
WHEN (日当数/B.収容数) < 1 THEN 1
ELSE (日当数/B.収容数+0.9999) END * 0.9)

カッコをつけないと「FROM句が指定の位置にありません」のメッセージが出てしまいます。
つけると、「右カッコがありません」メッセージがでてどちらでも動作してくれません。何かほかの要因があるのでしょうか?

投稿日時 - 2004-11-24 14:50:44

ANo.1

現状では、CASE文のネストの仕方がとりあえず違っているようです。

まず、
(CASE WHEN 販売数=0 THEN 0 ELSE・・・
のELSE以後で、もう一回CASEでやれば良いと思います。要するに、(1)の条件が満たなかったら、(2)と(3)の条件をもう一回、CASEで聞いてやる感じでしょうか。

Endなどの対応関係はお間違いなく・・・。

投稿日時 - 2004-11-23 22:19:40

補足

考えなおしてみました。

実際ネスト無しでやってみたのですが、エラーが出てしまいます・・・。
例文で、
SELECT 商品コード,在庫数,販売数,販売数/稼動日 AS 日当数,(CASE WHEN 販売数=0 THEN 1 ELSE 2 END) AS 判定
でやっても「右カッコがありません」メッセージがでてしまうのですが、何が悪いのでしょう?

>Endなどの対応関係はお間違いなく・・・。
ネスト内部でもEnd句は必要なのですか?
考えなおしてみましたが・・。
*************************************************
SELECT 商品コード,在庫数,販売数,販売数/稼動日 AS 日当数,(CASE WHEN 販売数=0 THEN 0 ELSE (CASE WHEN日当数/在庫数) < 1 THEN 1 ELSE (日当数/在庫数)+0.9) END)END) * 在庫数
**************************************************

重ね重ねお願い致します。

投稿日時 - 2004-11-24 09:21:46

あなたにオススメの質問