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

解決済みの質問

こういうSELECTは可能でしょうか?

テーブルA
----------
コード
区分
金額1
金額2

というテーブルがあるとして、その中から、

区分=1 AND 金額1>=0 の時は金額1、
区分=1 AND 金額1< 0 の時は金額2、
区分=2 AND 金額2>=0 の時は金額2、
区分=2 AND 金額2< 0 の時は金額1
をSELECTしたいのですが、1つのSELECT文で抽出する事は可能でしょうか?

SELECT ・・・←ここにどう書けば良いんでしょうか?
FROM テーブルA;

投稿日時 - 2004-08-03 17:45:58

QNo.949746

すぐに回答ほしいです

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

手元にOracleが無いので確認できませんが、DECODE関数か、CASE式を使えば良いように思えます。

参考URL:http://www.t3.rim.or.jp/~buchi/rdb.html#decode,http://homepage1.nifty.com/kojama/works/rdbms/mssql/sql.html#term04

投稿日時 - 2004-08-03 19:26:12

ANo.2

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

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

回答(7)

ANo.7

またウソつきました
条件が金額1>=0なので・・・

select * from(
(select コード,decode(SIGN(金額1),-1,金額2,金額1) as W_金額
from テーブルA
where 区分 = 1)
union all
(select コード,decode(SIGN(金額2),-1,金額1,金額2) as W_金額
from テーブルA
where 区分 = 2)
)
order by コード;

ですね

投稿日時 - 2004-08-06 09:36:59

ANo.6

SQL> insert into テーブルA values('A001',1,1,100);
1行が作成されました。
SQL> insert into テーブルA values('A002',1,-100,2);
1行が作成されました。
SQL> insert into テーブルA values('A003',2,100,3);
1行が作成されました。
SQL> insert into テーブルA values('A004',2,4,-100);
1行が作成されました。
SQL> commit ;
コミットが完了しました。


SQL> select * from(
2 (select コード,decode(SIGN(金額1),1,金額1,金額2) as W_金額
3 from テーブルA
4 where 区分 = 1)
5 union all
6 (select コード,decode(SIGN(金額2),1,金額2,金額1) as W_金額
7 from テーブルA
8 where 区分 = 2)
9 )
10 order by コード;

コード W_金額
-------- ----------
A001 1
A002 2
A003 3
A004 4


SIGN
構文SIGN(n)
用途n<0ならば-1、n=0ならば0、n>0ならば1を戻します。

前回は「ウソ」ついてごめんなさい
今度こそ「自身あり」です

投稿日時 - 2004-08-06 09:34:10

ANo.5

DECODEを使うなら、引数1に演算式を入れて下さい。
それかCASE式と使われてはいかがでしょう?

参考URL:http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti28.asp?educat=silver2

投稿日時 - 2004-08-04 09:23:41

ANo.4

[補足]

select * from(
(select コード,decode(金額1,金額1>=0,金額1,金額2) as W_金額
from テーブルA
where 区分 = 1)
union all
(select コード,decode(金額2,金額2>=0,金額2,金額1) as W_金額
from テーブルA
where 区分 = 2)
)
order by コード

投稿日時 - 2004-08-03 22:14:26

補足

ありがとうございます。

私も最初、decode関数を使おうと思ったのですが、
decode(金額1,金額1>=0,金額1,金額2)
のような書き方が出来ませんでした。
=<>などはdecode関数内で使えないものと思ったのですが、どうなのでしょうか?

投稿日時 - 2004-08-04 09:01:35

ANo.3

select * from(
(select コード,decode(金額1,金額1>=0,金額1,金額2) as W_金額
from テーブルA
where 区分 = 1)
union all
(select コード,decode(金額2,金額2>=0,金額2,金額1) as W_金額
from テーブルA
where 区分 = 2)
)

投稿日時 - 2004-08-03 22:11:47

ANo.1

ORACLEはあまり詳しくありませんが、UNIONを使用すれば出来るかも...

SELECT 金額1
FROM テーブルA
WHERE (区分=1 AND 金額1>=0) OR (区分=2 AND 金額2< 0)

UNION SELECT 金額2
FROM テーブルA
WHERE (区分=1 AND 金額1< 0) OR (区分=2 AND 金額2>=0)

投稿日時 - 2004-08-03 17:53:39