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

このQ&Aのポイント
  • selectであるテーブルからある値Aをとってきて、値Aに基づいて金額の登録テーブルを更新したいです。
  • テーブル1から値Aを取得し、値Aの値に応じて金額の登録テーブルを更新したいです。
  • selectの内容によって、登録するカラムを変えたい場合、テーブル1から値Aを取得し、値Aの値によって金額の登録テーブルを更新することができます。値Aが1の場合は金額1に、2の場合は金額2に、3の場合は金額3に登録します。
回答を見る
  • ベストアンサー

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

  • Oracle
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

テーブル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 キー); ではどうでしょう?

evaag777
質問者

お礼

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

その他の回答 (2)

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

[テーブル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.キー)

evaag777
質問者

お礼

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

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

手元に環境がないのでちゃんとした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.キー)

evaag777
質問者

お礼

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

関連するQ&A

  • INSERT文のSELECT部分の更新

    insert into selectについて教えてください。 あるテーブルからselectした値と、連続する値を 同時にinsertするする事はできますでしょうか? 使用DBはOracle9iです。 例えば、以下のようなテーブルがあった時に テーブルA カラム1 カラム2 カラム3 カラム4 この時に、カラム1,カラム2,カラム3を別のテーブルからselectし、 カラム4には「100001」から順に値を1ずつ増やしてながら セットしたい場合、1つのSQLで実行する事は可能でしょうか? ヒントなどいただけたらと思います。よろしくお願いします。

  • Insert Into Select での重複について

    DB:SQLServer2000 こんにちは お世話になっております。 トランザクションのテーブルA から ワークのテーブルBへInsert Into Select を使用してデータを格納しているのですが、その際に重複が発生してしまいます。 テーブルA 主キーあり テーブルB 主キーなし Delete B Insert into B select 項目1,項目2,・・・ from A With(Nolock) where 日付項目 = 20080101 テーブルAの主キー項目は全てテーブルBへInsertしており、Insert完了後のテーブルBの中身を見ると、まれに全く同じデータが2件出来ていることがあります。 このInsert into selectが実行されている間に、テーブルAに対して登録更新が行われることもあります。 色々と試してはいるのですが、原因が特定できずに困っております。 もし何かお気づきになられる方がいらっしゃいましたら、ご教示下さい。 よろしくお願い致します。

  • 動的に生成したカラムを使ったFUNCTION

    レコード型の使用方法がわからないので、悪戦苦闘しております。。。 【やりたいこと】 ・あるテーブルのある項目でGROUP BYし、別の項目事に集計した結果を  カラムとして出力 クロス集計と呼ぶのでしょうか? 上記の結果表を取得出来るFUNCTIONを作成したいのです。 【サンプルデータ】 CREATE TABLE t1 ( col1 integer ,col2 integer ,val integer ); INSERT INTO t1 VALUES( 1, 1, 1, ); INSERT INTO t1 VALUES( 1, 1, 1, ); INSERT INTO t1 VALUES( 2, 1, 1, ); INSERT INTO t1 VALUES( 2, 1, 1, ); INSERT INTO t1 VALUES( 3, 2, 1, ); INSERT INTO t1 VALUES( 3, 2, 1, ); INSERT INTO t1 VALUES( 4, 2, 1, ); INSERT INTO t1 VALUES( 4, 2, 1, ); ※ここでcol1、col2ともどんなデータが入っているか、わからないとします。 なので、まずcol2をDISTINCTしたものを求めました。 SELECT DISTINCT col2 FROM t1; この結果をカーソルを使ってループし、動的にカラムを作成するSQLを 作りました。 DECLARE cu refcursor; rec record; str text := 'SELECT col1 '; str2 text := ' FROM t1 GROUP BY col1 ORDER BY col1'; BEGIN OPEN cu FOR EXECUTE SELECT DISTINCT col2 FROM t1; LOOP FETCH cu INTO rec; IF NOT FOUND THEN EXIT; END IF; str := str || ', SUM( CASE WHEN col2 = rec.col2 THEN val END ) AS col_name' || rec.col2; END LOOP; CLOSE cu; RAISE INFO 'key = %', str || str2;  動的に生成されたSQLを実行したい ------------------------------------------------------- ※ちなみに動的に生成されたSQLはこんな感じになります。 SELECT col1 ,SUM( CASE WHEN col2 = 1 THEN val END ) AS col_name1 ,SUM( CASE WHEN col2 = 2 THEN val END ) AS col_name2 FROM t1 GROUP BY col1 ORDER BY col1; ------------------------------------------------------- あとがわかりません。。動的なカラムなので、どうやって取得すれば 良いのでしょうか? レコード型を使うと上手くいくのでしょうか? 試しにFUNCTION( func1 )の戻り値をRETURNS SETOF record として 内部で rec1 record; : :  FOR rec1 IN EXECUTE str || str2 LOOP RETURN NEXT rec1; END LOOP; RETURN; SELECT * FROM func1(); とやってみたら、 ERROR: a column definition list is required for functions returning "record" となります。。。 カラムの定義が必要だと言われているんだと思いますが、カラムは 動的になっているので、どうすれば良いのでしょうか??

  • レコードのコピー

    既存のレコードを1項目だけ変更して同一テーブルに登録します。 こちらで以前質問されていた内容を参考に以下のSQLを作ってみましたが、「SQLコマンドが正しく終了されていません」といわれてしまいます。 どうすればうまくいくのかわかりません。 教えてください。よろしくお願いします。 (ちなみに以下のSQLでの「NO」は変更項目です) INSERT INTO table (column1, column2, column3, KOUSIN_DATE) SELECT A.column1, A.column2, NO, TO_DATE(2005/12/01,'YYYY/MM/DD HH24:MI:SS') FROM table AS A WHERE A.column1 = '9999';

  • カラムをコピーして、新規カラムを作成したい

    既にあるカラムをコピーして、新たなカラムを作成したいのですが、うまくいきません。 どうしたらいいでしょうか? INSERT INTO `rtable`.`3_column` SELECT * FROM `rtable`.`2_column` 実行すると、下記エラーになります。 #1142 - INSERT command denied to user 'DBユーザー名'@'localhost' for table '3_column' 通常のINSERTなら出来るのですが、この場合のINSERTは、何か特別な実行権限になるのでしょうか? 環境:レンタルサーバ ちなみに、テーブルをコピーして、新規テーブル作成するのは、下記で出来たのですが、 「テーブルコピー」と「カラムコピー」では、何が違うのでしょうか? INSERT INTO `データベース名`.`newtable` SELECT * FROM `データベース名`.`oldtable` ;

    • ベストアンサー
    • MySQL
  • select insertで複数テーブルから値を取得したい

    環境:oracle9i select insertで、2つのテーブルから値を取得して、1つのテーブルにinsertすることは可能でしょうか? たとえば、以下の場合、どのようなSQL文を書けばよいか、アドバイスいただけますでしょうか。 よろしくお願いします。 insertしたいテーブル:A Aテーブルの項目:o,p,q,r,s,t 値を取得するテーブル:B,C Bテーブルの項目:o,p,q,r Cテーブルの項目:o,p,s,t oとpが主キーになっていて、それらが一致するBとCのデータを あわせて、Aにinsertしたいと思っています。 insert into A(o,p,q,r,s,t) select このあと、どのように書けばよいのかがわかりません。

  • Access にて DISTINCROW を使用した INSERT SELECT

    お世話様です。 Access2003 VBAにて、DoCmd.RunSQLを使用してSQL文を流す際、 普通のINSERT-SELECT文はOKですが、 そのSELECT文にDISTINCROW句を使用していると、 数百件程度のSELECT結果しかINSERTできません。 本当は数千件のSELECT結果をINSERTしたいのですが、 これを実行した場合、エラーにもならず、1レコードもINSERTされません。 ためしに、DINSTINCTROWではなく、SQL文を変更してDISTINCTにしてみたところ、 2000件以上でもINSERTできました。 DISTINCROW句を使用して数千件でもINSERTできる方法はあるでしょうか? ちなみにSELECT単体ですと、DISTINCTROWを使用していながら、 数千件でも結果を表示できます。 SQL例: str_SQL = " INSERT INTO 結果テーブル(フィールド1, フィールド2, フィールド3)  SELECT DISTINCTROW A.項目1, A.項目2, B.項目1  FROM テーブル1 A, テーブル2 B  (WHERE句はあってもなくても現象変わらず)  ORDER BY A.項目4 ASC, A.項目5 ASC " DoCmd.RunSQL (str_SQL) よろしくお願いいたします。

  • Insert文で・・・

    失礼します。SQL初心者なので質問します。 Insert into Aテーブル Select X , Y , Z From Bテーブル というSQLがあり、Aテーブルの列数を3から4にした際、AテーブルへのInsertの項目を、BテーブルからSelectされたX,Y,Z以外に普通の変数αも新たに作成した4つめの項目として同時にInsertしたい場合、どのようなSQLにすれば良いでしょうか? Insert into Aテーブル (Select X , Y , Z From Bテーブル),α みたいに都合良くはいきませんよね??

  • コラムの値からコラム・テーブルを検索

    プライマリキーが様々なテーブルで別の名前で利用されていると、テーブル同士の関連の全てが把握できずに困っています。以前にコラム名からテーブルを検索する方法を質問したのですが、私が扱っているデータベースでは、プライマリキーがシステムの別の場所で少しだけ異なる名前で利用されていることが多いので、その方法では把握できない関連が出てきます。 具体的には、EMPLOYEES__KEYというEMPLOYEESテーブルのプライマリキーがPERSONALIZE_EMPOYEESというテーブルでPSNLZ_EMP__KEYという名前で使われている状況を考えていただきたいと思います。PSNLZ_EMP__KEYのコラムのレコードは全てEMPLOYEES__KEY内のデータからとられているとします。 以前にselect TABLE_NAME from USER_TAB_COLUMNS where COLUMN_NAME = 'EMPLOYEES__KEY' というSQLで特定のコラムを使っているテーブルを全てリストアップできると教えていただいたのですが、今回のケースでは、同じような内容のコラムなのですが名前が異なるため上記のSQLでは検索できないテーブルがある場合、それをどうやってとってきたらよいのかということです。 コラムの値にtaro, jiro, hanakoなどのようにテーブルまたはシステム内でユニークな値が指定されている場合、コラムの値を指定し、「その値が使われているコラム・テーブルを列挙せよ」というような命令を与えればよいのだということまでは分かりますが、どのようにSQLを書けば良いか教えてください。

  • テーブル名をカラムとして取得する方法

    テーブル名をカラムとして取得する方法はありますでしょうか? オラクル8とVB6でプログラムを組んでいます。 例 TABLE Aの内容 カラム1 1 2 3 TABLE B カラム1の内容 4 5 6 SQLは簡略化してかきます。下記のSQLを実行した場合、 select A.カラム1 from A union select b.カラム1 from b 1 2 3 4 5 6 を取得できます。 例えば、上記で、SQL実行後、 下記のような値を取得したいです。 1 ,Aのテーブルだよ 2 ,Aのテーブルだよ 3 ,Aのテーブルだよ 4 ,Bのテーブルだよ 5 ,Bのテーブルだよ 6 ,Bのテーブルだよ それぞれのテーブルの名前を別名で結果に格納したいのです。 何か方法はありますでしょうか? なければ、unionせずに、2回SQLを発行し、それぞれに、 プログラム上で、「Aのテーブルだよ」を後で挿入したいと思っています。