同じIDを持つSelectの結果を1行で表示したい

このQ&Aのポイント
  • テンプテーブルにデータを挿入する際、同じIDを持つSelectの結果を1行で表示したい方法について教えてください。
  • テーブルAのデータをテーブルBに挿入する際、指定したカラムに対応する値が存在する場合はその値を挿入し、存在しない場合は0を挿入したいです。
  • データベースから特定の条件に合致するデータを取得し、結果をカラムごとに集約して1行で表示する方法を教えてください。
回答を見る
  • ベストアンサー

同じIDを持つSelectの結果を1行で表示したい

下記のようなデータを下記のようにテンプテーブルに挿入したいのですがわかるかたは教えて頂けますでしょうか。 < A table > ID name count 1 a 1 1 b 2 2 a 2 2 c 3 3 b 1 3 c 2 < B table > : 上記をこのテーブルに下記のように挿入したい ID | a | b | c 1 | 1 | 2 | 0 2 | 2 | 0 | 3 3 | 0 | 1 | 2 ※ 0は必要ないのですが、うまく表が書けなかったので・・   数字があるものだけ対象のカラムにカウントを挿入したい 宜しくお願い致します。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

Bテーブルは存在するということは、a,b,cなどAテーブルで発生するコードのバリエーションは予め分かっているということですね。 (例えばdが発生したときに、勝手にBテーブルにd列を作るわけにもいかないので) であれば、以下の通りとなります。 INSERT INTO Bテーブル SELECT ID, SUM(CASE WHEN [name]='a' THEN [count] END) AS a, SUM(CASE WHEN [name]='b' THEN [count] END) AS b, SUM(CASE WHEN [name]='c' THEN [count] END) AS c FROM Aテーブル GROUP BY ID

luvyak
質問者

お礼

ありがとうございました。助かりました。

関連するQ&A

  • SELECT結果から重複行を除く方法

    下記のようなテーブルから重複なくSELECTしたいと考えています。 temp_table ------------------------ | id | name_1 | name_2 | ------------------------ | 1 | aaaaaa | bbbbbb | | 2 | cccccc | dddddd | | 3 | cccccc | dddddd | | 4 | aaaaaa | bbbbbb | | 5 | cccccc | jjjjjj | ------------------------ SELECT結果が下記の要になるのが理想です。 DISTINCTを利用して SELECT DISTINCT id, name_1 || name_2 AS name FROM temp_tableとしましたがダメでした。 --------------------- | id | name     | --------------------- | 3 | ccccccdddddd | | 4 | aaaaaabbbbbb | | 5 | ccccccjjjjjj | --------------------- よい方法をご存じの方、宜しくお願いします。

  • 2つのテーブルを結合する際にIDを割り当てたい

    PHPでmySQLを作成しています。 現在学習中なのですが、自己解決できない問題が発生したのでどうかお知恵をお貸しください。 --- 同じデータベースにTableAとTableBがあります。 中身は下記のようだとします。 TableA      |  TableB id  name time | name time :   :   :  |  C1   D2 101 A1  B1  |  C2   D2    102 A2  B2  |   :    : 103 A3  B3  |  C20  C20 --- テーブルAのカラムid、name、timeの3カラム、テーブルBはname、timeの2カラムです。 これを --- TableA        TableB id  name time  name time :   :   : 101 A1  B1 102 A2  B2 103 A3  B3 104 C1  D1 105 C2  D2 :   :   : 123 C20  D20 --- とするような方法を教えてください。(TableBはレコードなし) テーブルの結合ではIDが割り当てられず、上手な方法が思いつきません。 どうかご教示のほど、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • SQL HAVING句の使い方について

    以下のテーブルAとテーブルBを結合して結果テーブルを出力したいと考えています。 (テーブルA上のIDのカウントした数をテーブルBに結合して出力したい。) テーブルA ----------- CATE ID aaa 001 bbb 001 ccc 003 ddd 004 テーブルB ----------- ID NAME 001 101 002 102 003 103 004 104 結果テーブル ---------------------- ID NAME COUNT 001 101 2 002 102 0 003 103 1 004 104 1 そこで、 =================================== SELECT B.ID, B.NAME, COUNT(A.ID) FROM TABLE_A B, TABLE_B B GROUP BY B.ID, B.NAME, A.ID HAVING A.ID = B.ID =================================== とSQLを書いてみましたが、 002 102 0 のテーブルAにIDが存在していない列が結果として表示されませんでした。 WHERE句でいう「WHERE A.ID =* B.ID」のようなことを行いたいのですが、どのように行えばよいでしょうか? よろしくお願いいたします。

  • select文でゴミデータを検索したい!!

    Oracle8i databaseに対するSQLについて教えていただきたく。 Table A(従業員)のRow_IDをキーにして3つの Table B(性別)、C(年齢)、D(部署)がそれぞれB.emp_id、C.person_id、D.target_id で関連付けられる場合に Table B、C、Dのどのテーブルにも関連付けられない宙ぶらりんなTable AのRow_IDの調べ方が分かりません。 尚、Table Aはマスター表でRow_IDの重複はありませんが、B、C、Dに関してはTabele Aのレコード1行に対してN行存在します。 誤ったレコードをTable Aに挿入してしまいメンテを行う為に宙ぶらりんになっているTable Aのレコードを調査したいのです。 どうか宜しくお願い致します。

  • C# Linq To XML について

    C#をつかって、XMLファイルを読み出し、値を検索しようとしていますが、ほしい情報をとることができません。もしわかる方がいましたら、ご回答よろしくおねがいします。 XMLは下記の形式で、このtableが4つ続いてあります。 <table> <row> <column name="Tests">Tests Textvalues</column> </row> <row> <column name="A">Id</column> <column name="B">Description</column> <column name="C">Value</column> </row> <row> <column name="A">1</column> <column name="B">no</column> <column name="C">34 25 E0</column> </row> <row> <column name="A">2</column> <column name="B">yes</column> <column name="C">34 25 E1</column> </row> </table> <table>.....つづく 下記のようなコードを書きました。 XElement xelement = XElement.Load(ファイルパス); IEnumerable<XElement> tables = xelement.Elements(); foreach (XElement table in tables) { var name = from nm in table.Elements("row") where (string)nm.Element("colmun").Attribute("B")== "no"              select nm; foreach (var a in name) { Console.WriteLine(a); } } 残念ながら、このコードでは、nameの中身がからっぽです。 目的は、Bの値からCの値を検索することです。 以上、よろしくお願いします。

  • 集計方法について教えて下さい。PHP+MYSQL

    こんにちは、よろしくお願い致します。 データベースに下記のようなデータが入っています。 table_A cd name --------------- 1000001 aaa 1000002 bbb 1000003 ccc 1000004 ddd 1000005 eee 1000006 fff 1000007 ggg 1000008 hhh 1000009 iii 1000010 jjj table_B cd type point --------------- 1000001 A 100 1000001 B 50 1000001 C 30 1000004 C 20 1000005 B 70 1000009 A 10 1000009 C 40 table_Aと、table_Bから、下記table_Cの内容 table_C cd name count point_total ------------------------------ 1000001 aaa 3 180 1000002 bbb 0 0 1000003 ccc 0 0 1000004 ddd 1 20 1000005 eee 1 70 1000006 fff 0 0 1000007 ggg 0 0 1000008 hhh 0 0 1000009 iii 2 50 1000010 jjj 0 0 を得るには、どのようなSQLを書けば良いのでしょうか? table_Cのcount項目は、cdでマッチするtable_Bのtypeの種類をカウントしたもので table_Cのpoint_total項目は、cdでマッチするtable_Bのpointを合計した数値になります。 分かりにくい質問ですみませんがアドバイス頂けると嬉しいです。 具体的にどのような方法で実現できるか、教えて頂けると有難いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • select結果でのupdate

    テーブルがふたつあります。 片方のテーブルA(hoge1)のnameに、もう片方のB(hoge2)のnameをいれたいのです。 テーブルAとBはidでリレーションを張って、それぞれ対応する列にいれたいと思ってます。 tabale A hoge1 id | name | foo ----+-----+---- 1 | 1111 | xxxx 2 | 2222 | yyy 3 | 3333 | zzzz tabale B hoge2 id | name | bar ----+-----+--- 1 | 1.net | 1 2 | 2.net | 0 3 | 3.net | 1 期待する結果 tabale A hoge1 id | name | foo ----+-----+---- 1 | 1.net | xxxx 2 | 2.net | yyy 3 | 3.net | zzzz Bに変更はなし update hoge1 set name = b.name from hoge2 b , hoge1 a where a.id = b.id ; とやるとname列が全て 1.netになってしまい UPDATE hoge1 SET name = (select b.name from hoge2 b , hoge1 a where b.id = a.id ) ; ERROR: More than one tuple returned by a subselect used as an expression. とするとエラーです。(oracleならうまくいくとnetで調べたのですが。。) どなたかご教授いただけますか。

  • 複数行の結果を一行でSELECTするには

    2つのテーブルからデータを取得します。 FKがstaff_idになります。 ●staff_tbl staff_id staff_name staff_group 1     田中     A  2     鈴木     A 3     森田     B ●value_tbl staff_id value_name value 1     area     大阪 1     year      5 1     pay      1000 2     area     奈良 2     year      2 2     pay      900 テーブルのサンプルはこのようなイメージです。 結果を下記のように取得したいのですが。。。 1 田中 A 大阪  5 1000 2 鈴木 A 奈良  2 900 サブクエリを使うのか?TOを使うのか、ググって何度か試したけども いまいちわかりませんでした。 どのようなSQLになるんでしょうか? すいませんが、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLでのレコード更新、追加処理

    Windows7 32bit MySQL5.5を使用しています。 テーブルのスペースが崩れてしまっていて見づらいかと思いますが よろしくお願いします。 ・table B +------+------------------+------+ | id | name | id_A | +------+------------------+------+ | 1 | 手順書作成 | 1 | | 2 | レビュー | 1 | | 3 | 開発 | 2 | | 4 | 社内・社外研修 | 3 | +------+------------------+------+ (id=主キー、name=文字列、id_A=テーブルAを参照するための外部キー) ↓ 1回だけ以下のプログラムを実行し、table Cを生成します create table C (SELECT * FROM B); alter table C add flag Boolean default FALSE; ↓ ・table C +------+------------------+------+------+ | id | name | id_A | flag | +------+------------------+------+------+ | 1 | 手順書作成 | 1 | 0 | | 2 | レビュー | 1 | 0 | | 3 | 開発 | 2 | 0 | | 4 | 社内・社外研修 | 3 | 0 | +------+------------------+------+------+ その後、Bが不定期に更新されるため、どこかの タイミングで、同様にCにも更新情報を反映したいのです。 ↓ ・更新されたtable B +------+------------------+------+ | id | name | id_A | +------+------------------+------+ | 1 | 手順書作成 | 1 | | 2 | レビュー | 1 | | 3 | 開発 | 2 | | 4 | 社内研修 | 3 | | 5 | 社外研修 | 3 | +------+------------------+------+ ↓ ・table C +------+------------------+------+------+ | id | name | id_A | flag | +------+------------------+------+------+ | 1 | 手順書作成 | 1 | 1 | | 2 | レビュー | 1 | 0 | | 3 | 開発 | 2 | 0 | | 4 | 社内研修 | 3 | 1 | ←このレコードは更新したい | 5 | 社外研修 | 3 | 0 | ←このレコードは追加したい +------+------------------+------+------+ どのように指定をすればいいでしょうか。 思いつくのは create table temp( select B.id, B.name, B.id, C.flag from B left join C on(C.id=B.id)); drop table c; create table c(select * from temp); drop table temp; という方法ですが、もう少しスマートな処理方法がないか、 そして、default値が反映されたものにしたいのです。 (上記を実行すると以下になります) ・table temp +------+------------------+------+------+ | id | name | id_A | flag | +------+------------------+------+------+ | 1 | 手順書作成 | 1 | 1 | | 2 | レビュー | 1 | 0 | | 3 | 開発 | 2 | 0 | | 4 | 社内研修 | 3 | 1 | | 5 | 社外研修 | 3 | NULL |←NULLではなく、FALSEとしたい +------+------------------+------+------+ どうぞ宜しくお願いします。

    • ベストアンサー
    • MySQL
  • テーブルのどちらかにデータがない事があるテーブル結合について

    ■table a のテーブル構成 date a_id b_id c_id a_count ■table b のテーブル構成 date a_id b_id c_id b_count value 上記の2つのテーブル構成から、 ■date a_id b_id c_id毎の集計データ date a_id b_id c_id a_count b_count value を抽出するSQLが知りたいです。 table aにあって、table bに存在しない。又は逆もある為、 union しかないと思うのですが、思いつきません。。

    • ベストアンサー
    • MySQL