• ベストアンサー

こういう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;

  • Oracle
  • 回答数7
  • ありがとう数15

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

手元に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

その他の回答 (6)

  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.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 コード; ですね

  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.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を戻します。 前回は「ウソ」ついてごめんなさい 今度こそ「自身あり」です

回答No.5

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

参考URL:
http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti28.asp?educat=silver2
  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.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 コード

discovery
質問者

補足

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

  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.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) )

回答No.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)

関連するQ&A

  • SQLのSELECT文教えてください。

    VB5.0で、DBはSqlServer2000です。 SQL文のSELECT文で質問です。 ○A_TABLEの構成(概略) ・・・担当コード1・・・担当コード2 ○TANTO_TABLE 担当コード/担当名 (質問)TANTO_TABLEからA_TABLEの担当コード1と担当コード2の担当名を抽出したいのです。 次のSQLだと担当コード1のみしか抽出できません。 効率よく担当コード1と2の担当名を抽出するSQLを教えてください。お願いします。 SELECT 担当名 FROM A_TABLE,TANTO_TABLE WHERE A_TABLE.担当コード1 = TANTO_TABLE.担当コード

  • SELECTのスピード

    SELECTのスピードでどの方法が 検索スピードが速いのか教えてもらいたいのですが Aのテーブル DENNO CODE Bのテーブル CODE NAME Aのテーブルを主にAのCODEでBのテーブルを参照したい時 (1) SELECT A.DENNO,A.CODE, (SELECT B.NAME from B where A.CODE=B.CODE) AS NAME from A (2) SELECT A.DENNO,A.CODE,B.NAME FROM A LEFT JOIN B ON A.CODE=B.CODE (3) SELECT A.DENNO,A.CODE,B.NAME FROM A , B WHERE A.CODE=B.CODE(+)

  • SELECT文が上手く書けません

    会社からSQLのSELECT文を書けと言われて3日目です。PostgreSQL のシステムでWHERE以下が WHERE 売上年月 = ? AND 得意先コード = ? AND 売上種別 = ? としました。画面上では売上年月、得意先コード、売上種別で検索できるようになっているのですが、3種類全て入力しないとエラーになります。この内1種類の入力でも検索できるようにしたいのですが、どのように書けばいいでしょうか? ANDをORに変えたりしたのですが上手くいきません。 全体のSELECT文は external.売上= SELECT 売上番号、売上日、得意先コード、売上区分、金額、入力日 FROM 売上一覧表 WHERE 売上年月 = ? AND 得意先コード = ? AND 売上種別 = ? です。 よろしくお願いします。

  • SQLでSELECTした一覧をUPDATEする方法を教えてください。

    AのテーブルをINNER JOINのWHERE文を用いて、selectした結果の項目にBテーブルの内容をUPDATEしたいのですが、 下記方法でうまくいきません。 解決方法を教えてください。 よろしくお願いいたします。 SELECT A.PointZan FROM A INNER JOIN B ON A.Code = B.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止') UPDATE A SET PointZan = (SELECT B.PointZan FROM B INNER JOIN A ON B.Code = A.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止'))

  • select文について

    現在、"user"というテーブルに"id"と"date(datetime)"という項目があり、その"date"にあるデータの中から月を指定して抽出したくて以下ようなSQL文を書いたのですがうまくいきません。 SELECT `id` FROM `user` WHERE convert((SELECT extract(month from `date`) FROM `user`), INTEGER) = 9 mysql5.0です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 【初歩的な質問ですが・・・】 SQL文書き方がわかりません

    SQLの知識に乏しい者です。 よろしくお願い致します。 ●テーブルA ・会計コード ・年度 ・部署番号 ・社員番号 ・その他幾つかのデータ ※Where句で「年度>2002年」以降を抽出 のテーブルがあります。 この時、Bテーブルで ●テーブルB ・会計コード(主キー) ・年度 ・部署番号(主キー) ・社員番号(主キー) ・その他幾つかのデータ ※Aテーブルで抽出されたデータの中から絞り込む というテーブルを抽出するSQL文を組みたいのですが、効率の良いやり方がわかりません。 副問合せで  Select [B表で抽出した列名…]  From B表  Where 会計コード = (Select 会計コード               From A表               Where 年度 > '2002')  AND 部署番号 = (Select 部署番号             From A表               Where 年度 > '2002') ・・・・以下省略 の様に書くと効率が悪い気がしました。 (実際には、副問合せが6個書くことになるため) 良い書き方を知っている方がいらっしゃいましたら、よろしくお願い致します。

  • selectの内容によって、登録するカラムを変えたい

    selectの内容によって、登録するカラムを変えたい selectであるテーブルからある値Aをとってきます。 値Aが1の時は別テーブルの金額1に登録、2の時は金額2に登録、3の時は金額3に登録 という処理を行いたいです。 同一レコードに対して複数の金額がある事があります。 テーブル1(取得テーブル) ------------------ キー 値A 金額 1   1  500 1   3  300 2   3  200 ------------------ テーブル2(登録テーブル) ------------------ キー 金額1 金額2 金額3 1   500  0  300 2    0  0  200 ------------------ いま、 insert into テーブル2 SELECT 項目 from テーブル1 というように1つのSQLで、登録、削除をしようとしていますが 可能でしょうか?。方法がよく分かりません。

  • SELECT文

    SELECT文で区分ごとに番号、番号名を表示させたいのですが。 T_テーブルに区分が1から5まであるのですが、select文一発で表示したいです。 番号は1~5,番号2は5~6まで表示したいのです。 区分は2の情報を取得する 1テーブルの情報を番号ごとに分けて表示したいです (例) 番号 番号名     番号1 番号名2 1 iti       5 go 2 ni      6 roku 3 san      7 nana 4 yon      8 hati T_テーブル情報 下記 区分 varchar(2) 番号 varchar(6) 番号名 varchar(16) SELECT T_テーブル.区分, T_テーブル.番号, T_テーブル.番号名, T_テーブル_1.番号, T_テーブル_1.番号名 FROM T_テーブル AS T_M_名称_1 INNER JOIN T_テーブル ON T_テーブル_1.区分 = T_テーブル.区分WHERE T_テーブル.区分 = '2'

  • Select文のパフォーマンスについて

    Select文のパフォーマンスについて質問です。 (1)select * from table1 where col1='00001' and kbn in (1,2,3,4) (2)select * from table1 where col1='00001' and (kbn = 1 or kbn = 2 or kbn = 3 or kbn = 4) (1)と(2)ではどちらがパフォーマンスがよいのでしょうか? SQLServer2008

  • Select文1 マイナス Select文2

    テーブルA ユーザーID,地名,県名,評価 テーブルB ユーザーID,県名,制覇flag のような二つのテーブルがあると仮定してSelect文1、 "select 県名,count(地名) from テーブルA where ユーザーID=1 group by 県名 order by count(地名);" の結果が 県名,count(地名) 北海道,30 東京,22 京都,15 名古屋,10 鳥取,9 沖縄,8 であるとし、 Select文2、 "select 県名 from テーブルB where usrid=1 and 制覇flag='true'" の結果が、 県名 北海道 東京 とします。 このSelect文1の結果から、Select文2の結果を引いて 県名,count(地名) 京都,15 名古屋,10 鳥取,9 沖縄,8 の結果を得るにはどうすればよいでしょうか? Mysqlのバージョンは5.0.21です。

    • ベストアンサー
    • MySQL