• ベストアンサー

[過去質問の続き]CREATE TEMPORARY TABLEで、3テーブルをくっつけたい

yambejpの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

データの持ち方をかえると簡単にいけそうですね。 去年テーブルと今年テーブルが分かれているのが 意味ないですし、GNPと人口も同じ列に集計したいなら 別の持ち方をするとよいでしょう。 テーブルはこうしてください。 CREATE TABLE `TABLE1` (`県ID` VARCHAR(10) ,`年月` VARCHAR(6) ,`KIND` VARCHAR(10) ,`DATA` DOUBLE); INSERT INTO `TABLE1` SELECT `県ID`,`年月`,'GNP' AS `KIND`,`GNP` AS `DATA` FROM `去年テーブル` ; INSERT INTO `TABLE1` SELECT `県ID`,`年月`,'人口' AS `KIND`,`人口` AS `DATA` FROM `去年テーブル` ; INSERT INTO `TABLE1` SELECT `県ID`,`年月`,'GNP' AS `KIND`,`GNP` AS `DATA` FROM `今年テーブル` ; INSERT INTO `TABLE1` SELECT `県ID`,`年月`,'人口' AS `KIND`,`人口` AS `DATA` FROM `今年テーブル` ; するとTABLE1はこうなります 県ID 年月 KIND DATA 001 200412 GNP 100 001 200501 GNP 101 001 200502 GNP 103 001 200511 GNP 106 002 200412 GNP 202 001 200412 人口 30 001 200501 人口 30 001 200502 人口 31 001 200511 人口 34 002 200412 人口 60 001 200603 GNP 108 001 200604 GNP 109 002 200603 GNP 230 001 200603 人口 40 001 200604 人口 44 002 200603 人口 50 ピボットはこうするといいでしょう CREATE TEMPORARY TABLE `TEMP_PIVOD`( `年月` VARCHAR(10) ,`FLG` VARCHAR(10) ,`1` INT DEFAULT 0 ,`2` INT DEFAULT 0 ,`3` INT DEFAULT 0 ,`4` INT DEFAULT 0 ,`5` INT DEFAULT 0 ,`6` INT DEFAULT 0 ,`7` INT DEFAULT 0 ,`8` INT DEFAULT 0 ,`9` INT DEFAULT 0 ,`10` INT DEFAULT 0 ,`11` INT DEFAULT 0 ,`12` INT DEFAULT 0 ); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`1`) VALUES('200412','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`2`) VALUES('200501','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`3`) VALUES('200502','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`4`) VALUES('200503','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`5`) VALUES('200504','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`6`) VALUES('200505','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`7`) VALUES('200506','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`8`) VALUES('200507','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`9`) VALUES('200508','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`10`) VALUES('200509','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`11`) VALUES('200510','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`12`) VALUES('200511','去年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`1`) VALUES('200603','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`2`) VALUES('200604','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`3`) VALUES('200605','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`4`) VALUES('200606','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`5`) VALUES('200607','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`6`) VALUES('200608','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`7`) VALUES('200609','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`8`) VALUES('200610','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`9`) VALUES('200611','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`10`) VALUES('200612','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`11`) VALUES('200701','今年',1); INSERT INTO `TEMP_PIVOD`(`年月`,`FLG`,`12`) VALUES('200702','今年',1); するとTABLE2はこうなります 県ID KIND FLG 1 2 3 4 5 6 7 8 9 10 11 12 001 GNP 去年 100 101 103 0 0 0 0 0 0 0 0 106 001 人口 去年 30 30 31 0 0 0 0 0 0 0 0 34 001 GNP 今年 108 109 0 0 0 0 0 0 0 0 0 0 001 人口 今年 40 44 0 0 0 0 0 0 0 0 0 0 002 GNP 去年 202 0 0 0 0 0 0 0 0 0 0 0 002 人口 去年 60 0 0 0 0 0 0 0 0 0 0 0 002 GNP 今年 230 0 0 0 0 0 0 0 0 0 0 0 002 人口 今年 50 0 0 0 0 0 0 0 0 0 0 0 つづく

litton101
質問者

お礼

yamabejpさん、再々の丁寧なご指導ありがとうございます、感謝に耐えません。 去年テーブルと今年テーブルが分かれている理由は、 去年と今年で集めているデータが違うとかいろいろ事情はありますが、 おっしゃるように、本件に限ればテーブルを分ける意味はありませんね。 納得です。 > テーブルはこうしてください。 > CREATE TABLE `TABLE1` > (`県ID` VARCHAR(10) > ,`年月` VARCHAR(6) >(略) まずは、phpMyAdmin経由で、上のSQL文から一つ一つ実行させていただいている ところですが見事に一瞬でTABLE1ができました。#2さんへの御礼にも書きま したが、INSERTしたいデータをSELECTすればよかったのですね。 SEL,DEL,INS,UPD文は、それぞれ混在させられないものだと思っていました。 少し、追加質問させてください。 (1) 人口とGNPは、それぞれdecimal(8,1)、decimal(7,2)と型が異なるようです。 両者を`DATA` DOUBLE とくくるのは、大丈夫でしょうか。 (2) これって、テンポラリテーブルでなく、普通のテーブルのようですが、 今年テーブルの人口、GNPデータは、各県の担当者が毎月(日々)インターネット 経由で日々更新(追加)しています。 TABLE1は、照会する時点での最新データと同期が取れなくなるような気がするの ですが、「CREATE TABLE `TABLE1`・・・」を実行する前に、いったんDROPして 再度CREATEしなおすという運用になるのでしょうか。 > するとTABLE1はこうなります > 県ID 年月 KIND DATA > 001 200412 GNP 100 こちら、見事におっしゃるとおりになりました。 > ピボットはこうするといいでしょう > CREATE TEMPORARY TABLE `TEMP_PIVOD`( > `年月` VARCHAR(10) こちら、ほぼこのままやってみたのですが、 エラーはなかったですが、phpMyAdminには各INSERT文の脇に 「影響された行数=1」のように出て、何も起こりません。 テンポラリテーブルっていうのは、そういうものなのですよね? とりあえず、今現在までに適用させていただいた部分はここまでです。 これから、続きをためさせていただきます。まずは御礼申し上げます。

関連するQ&A

  • 日本にGNPを抜かれた時の西ドイツの反応は?

    先日テレビで、日本は1969年にGNPでアメリカに次いで2位となり、当時の西ドイツを抜いたと放送していました。 日本にGNPを抜かれた時の西ドイツはどんな反応だったのですか?  「悔しい、残念」「たかがアジアの国ごときに抜かれるとは」「人口が違うから仕方ない」「どうでもいい」etc・・・こんな感じだったのですか? 中国にGDPを抜かれた(かもしれない)今の日本と似た世論でしたか?知っている方、覚えている方がいれば是非教えてください。

  • 日本経済はすでに中国に負けている?

    中国のGDPが韓国を上回りました。 将来は日本どころか米国も抜かすかなあ? 人口が多いから仕方ない。 でも外務省経済指標のGDP国民一人当たりは、 中国約十万円、韓国百万円、日本三百五十万円とあります。 …観点が違うかも知れないけど。 「日本経済はすでに中国に負けているよ」と言う人が多いような… 何故、中国がそんなに脅威なのでしょうか?

  • create temporary tableについて

    MYSQL5.0を利用して、PHPから以下の作業をしています。 create temporary table tempで作成された一時的なテーブル(temp)は削除しなくても問題ないのでしょうか? もし削除する必要がある場合は、drop temp で大丈夫でしょうか?

    • ベストアンサー
    • MySQL
  • Tableを動的に増やしたい。

    お世話になります。 asp.net(c#)で開発をしています。 c#は初めて1月程度です。 やりたいことは、 Tableを動的に増やす。 と言うことです。 たとえば、こんなイメージです。 <asp:Table ID="Table001"></asp:Table> <asp:Table ID="Table002"></asp:Table> <asp:Table ID="Table003"></asp:Table> .... と言うように、データの条件に合わせてテーブルを動的に増やして表示。そして、その各テーブルは<p></p>タグで切り分けたいのです。 表示するデータはSQLで取得し、その抽出条件によって、テーブルの個数が変動することが考えられます。 ご存知の方、知恵をお貸しください。

  • エクセルのコマンドを教えて頂きたいです。

    エクセルのコマンドを教えて頂きたいです。 エクセル2007でデータ整理をしており、 以下の処理を行いたいのですが、方法が分かりません。 よろしくお願いします。 【加工前】 A行にid(県名) B行に値(例えば人口)  が入っています。 このデータに対応するように以下のデータを接合させたいと考えています。 C行にid(県名) D行に値(例えば売上)  が入っています。 E行にid(県名) F行に値(例えば所得)  が入っています。 ただし、このidはA≠C≠Fとなっています。 つまり、 A行のidは、『1、2、3、4、5、6、7、8、9』となっており、全てのidが存在するのですが、 C行のidは、『1、3、5、6、7、9』 F行のidは、『2、4、5、8、9』 のようになっています。 この状態から、以下の状況にしたいと考えています。 【加工後】 A行:id B行:人口 C行:売上 D行:所得 ※県名1の所得は欠損のまま(当たり前なのかもしれませんが。) よろしくお願いします。

  • GDP等、日本の近況。基本的愚問ですm(__)m

    検索等で調べてもよく理解出来ません。噛み砕いてご解説して頂けますか。 寂しい事ですが、今や日本は、中国を始めアジアの国々にも負けている、 とよく言われます。 この不景気でもGDPは今でも米国に次いで2位なのですか? それとGDPを人口で割った…何と言いましたっけ( _ _)ガクッ それこそが本当の国民の豊かさを示す数値だと思うのですが、 日本は、世界各国で、どの辺に位置しているのでしょうか?

  • すみませんが教えてください。JAVA

    県テーブル 県ID,県名 001,北海道 002,青森 003,秋田 004,岩手 方角テーブル 方角ID,方角名 001,東 002,南 003,西 004,北 県位置テーブル 県,県,方角 001,002,002 003,004,001 このようなテーブルがあった時に、「北海道」と検索して「北海道の南に青森がある」のように表示させるプログラムをjavaで作成しているのですが、 select 県名,方角名 from 県,方角 where 県ID or 方角ID in (select * from 県位置 where 県ID like '%" + 001 + "%' ) のようなSELECT文を書くと ERROR 1241 (21000): Operand should contain 1 column(s) と表示されてしまいます。 どのようにすればうまくいくのでしょうか?

  • 別々の性質のもつテーブルのクエリーとレポートについて

    ACCESS2000において テーブルA  ID  氏名  口座   テーブルB  ID  振込み月  金額A テーブルC  ID  振込み月  開発費 テーブルD  ID  振込み月  金額B 上記のようなテーブルが存在するときに、 リンクまたはクエリーでそれぞれのテーブルの 内容をまとめて、レポートを出力させます。 このとき、それぞれのテーブルでの振込み月は 必ず毎月存在するとは限らないので、存在しない 月はデータがありません。 それぞれのテーブルのデータを集計し、各IDにおける その月の振込み月の金額の合計を算出します。 レポートにおいては、振込み月とそれぞれの金額と 金額の合計をレポート印刷します。 そのままのクエリーを考えると、それぞれのテーブルの データをもつIDのみ、クエリーのデータとなってしまう ので、その月のデータがない場合でも金額¥0として クエリーとしたいですが、どのようにすればいいでしょうか?よろしくお願いします。

  • アクセスログテーブルの構造について

    このジャンルでお願いします。 よくアクセスログの解析を無料で(リンクを貼ったりして)行ってくれるサービスがありますが、 そのデータベースの構造というかテーブルの構造はどのようになっているのでしょうか? 例えば、膨大なレコード数になると思うので それを利用するユーザー毎にテーブルを分けるとかするのでしょうか? あるいはユーザー毎、年毎、月毎、日毎、に分けるとか? 本来ならテーブルを分割したりするのは違うんじゃないかなぁと思ったりするのですが、 なので次のように、 CREATE TABLE `accesslog` ( `id` int NOT NULL auto_increment, `user_id` varchar(16), `created` datetime, `ip` varchar(64), FOREIGN KEY(`user_id`) REFERENCES `user`(`id`) ); ユーザーも全ての期間のデータも1つのテーブルで管理するのが普通だとは思うのですが、 アクセスログだけは利用するユーザー数にもよりますがやはり膨大になりますよね? そうすると1つのテーブルだと無理があると思うのです。 あるいは単にテキストファイルとして保存する方法もあるのかな?と思うのですが、 やはりなにかとSQLで操作したいのでMySQLなどのテーブルの設計が知りたいです。

  • tableの連結

    http://okwave.jp/qa/q7944235.html の件に引き続きどうSQL文を書いてよいかわからず困っています。 create table team(team_id int not null primary key,team_name varchar(30),year int(4), leagueid int(32) ); insert into team values(1,"A",2012,1),(2,"B",2012,1),(3,"C",2012,1),(4,"D",2012,1),(5,"A",2012,2),(6,"B",2012,2),(7,"C",2012,2),(8,"D",2012,2),(9,"A",2011,1),(10,"B",2011,1),(11,"C",2011,1),(12,"D",2011,1); create table taisen(id int not null primary key auto_increment,hometeam int,homepoint int,awayteam int,awaypoint int); insert into taisen (hometeam,homepoint,awayteam,awaypoint) values(1,3,2,2),(3,1,4,0),(1,0,3,2),(2,2,4,2),(1,1,4,2),(2,0,3,0),(2,1,1,2),(4,1,3,3),(3,5,1,2),(5,3,6,3),(5,1,7,1),(7,1,8,1),(9,1,10,1),(11,1,12,3); とあり、 taisen.hometeamとteam.idとtaisen.awayteamとteam.idを結合し、taisenテーブルにteamのyear、leagueid、team_nameが表示されればと思っています。 通常のjoinであればできるのですが、どのようにsql文をかけばよいのかわからず困っています。 taisen.hometeamとteam.idとtaisen.awayteamとteam.idを結合したときに | taisen.hometeam | ホームチーム名 | taisen.homepoint | taisen.awayteam | アウェイチーム名 | taisen.awaypoint | team.year | team.leagueid で結果がとれるようにしたいのですが、どのようにしたらよろしいでしょうか?

    • ベストアンサー
    • MySQL