プロが教えるわが家の防犯対策術!

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で、登録、削除をしようとしていますが
可能でしょうか?。方法がよく分かりません。

A 回答 (3件)

テーブル1のレコードが、キーと値Aで一意である前提ですが



insert into テーブル2
select キー,金額1,金額2,金額3
from
(select
キー,
max(case when 値A = 1 then 金額 else 0 end) 金額1,
max(case when 値A = 2 then 金額 else 0 end) 金額2,
max(case when 値A = 3 then 金額 else 0 end) 金額3
from テーブル1
group by キー);

ではどうでしょう?
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみます。

お礼日時:2010/10/06 13:35

[テーブル1]は[キー]と[値A]でユニークになると仮定すると、下記の様なSQLでもINSERTできるかと。


なお、ORACLE では試していません。


INSERT INTO テーブル2 (キー, 金額1, 金額2, 金額3)
SELECT
COALESCE(t1.キー, t2.キー, t3.キー),
COALESCE(t1.金額, 0),
COALESCE(t2.金額, 0),
COALESCE(t3.金額, 0)
FROM
(SELECT キー, 金額 FROM テーブル1 WHERE 値A = 1) t1
FULL OUTER JOIN (SELECT キー, 金額 FROM テーブル1 WHERE 値A = 2) t2 ON (t1.キー = t2.キー)
FULL OUTER JOIN (SELECT キー, 金額 FROM テーブル1 WHERE 値A = 3) t3 ON (t2.キー = t3.キー OR t1.キー = t3.キー)
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございました。

お礼日時:2010/11/07 15:54

手元に環境がないのでちゃんとしたSQL文が提示できませんので。


まず、テーブル1のキーをdistinctしてテーブル2にキーと金額1~3を0でinsert
insert into テーブル2 select distinct キー,0,0,0 from テーブル1
次にテーブル1の内容でUPDATEする。
update テーブル2 M
set 金額1 = ( select 金額 from テーブル1 S where 値A = 1 AND 金額 > 0 and S.キー = M.キー)
update テーブル2 M
set 金額2 = ( select 金額 from テーブル1 S where 値A = 2 AND 金額 > 0 and S.キー = M.キー)
update テーブル2 M
set 金額3 = ( select 金額 from テーブル1 S where 値A = 3 AND 金額 > 0 and S.キー = M.キー)
    • good
    • 0
この回答へのお礼

ありがとうございます。
ちょっと試してみます。

お礼日時:2010/10/06 13:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!