• ベストアンサー

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

yambejpの回答

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

あ、肝心のTABLE2作成のクエリーがぬけてましたね? 修正してソースをしたにつけます。 >(1) 人口とGNPは、それぞれdecimal(8,1)、decimal(7,2)と型が異なるようです。 >両者を`DATA` DOUBLE とくくるのは、大丈夫でしょうか。 精度の問題であれば大丈夫だと思います。 表示の問題であれば、集計後は人口とGNPを同じ列で 表示すると考えると、桁数の違うdecimalは無効です。 当座DOUBLEが妥当でしょう。 >(2) これって、テンポラリテーブルでなく、普通のテーブルのようですが、 >今年テーブルの人口、GNPデータは、各県の担当者が毎月(日々)インターネット >経由で日々更新(追加)しています。 >TABLE1は、照会する時点での最新データと同期が取れなくなるような気がするの >ですが、「CREATE TABLE `TABLE1`・・・」を実行する前に、いったんDROPして >再度CREATEしなおすという運用になるのでしょうか。 運用方法を変えられるなら通常テーブルが望ましいですが そうも行かないようなのでテンポラリで運用ください。 テンポラリならDROPする必要はありません。 以下ご指摘いただいた分を修正した全文です。 CREATE TEMPORARY 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 `今年テーブル` ; 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); CREATE TEMPORARY TABLE `TABLE2` SELECT `県ID`,`KIND`,`FLG` ,SUM(`DATA`*`1`) AS `1` ,SUM(`DATA`*`2`) AS `2` ,SUM(`DATA`*`3`) AS `3` ,SUM(`DATA`*`4`) AS `4` ,SUM(`DATA`*`5`) AS `5` ,SUM(`DATA`*`6`) AS `6` ,SUM(`DATA`*`7`) AS `7` ,SUM(`DATA`*`8`) AS `8` ,SUM(`DATA`*`9`) AS `9` ,SUM(`DATA`*`10`) AS `10` ,SUM(`DATA`*`11`) AS `11` ,SUM(`DATA`*`12`) AS `12` FROM `TABLE1` LEFT JOIN `TEMP_PIVOD` ON `TEMP_PIVOD`.`年月`= `TABLE1`.`年月` GROUP BY `県ID`,`FLG`,`KIND`; CREATE TEMPORARY TABLE `FLG_TABLE`(`FLG` VARCHAR(10)); INSERT INTO `FLG_TABLE` VALUES('去年'),('今年'); CREATE TEMPORARY TABLE `KIND_TABLE`(`KIND` VARCHAR(10)); INSERT INTO `KIND_TABLE` VALUES('GNP'),('人口'); SELECT * FROM `地域マスター`,`FLG_TABLE`,`KIND_TABLE` LEFT JOIN `TABLE2` ON `地域マスター`.`県ID`=`TABLE2`.`県ID` AND `FLG_TABLE`.`FLG`=`TABLE2`.`FLG` AND `KIND_TABLE`.`KIND`=`TABLE2`.`KIND` ORDER BY `地域マスター`.`県ID`,`FLG_TABLE`.`FLG`,`KIND_TABLE`.`KIND`

litton101
質問者

お礼

ようやくうまくできました。 やっぱりデータが多すぎるのがクエリー結果を返してこない原因だったようで、 ORDER BY句の前にWHERE 国ID='C001'などと絞込条件を挟んだらすぐに結果が出てきました。 あとは、php側で工夫すれば、期待していたような仕組みを作ることができそうです。 yamabejpさん、本当にお世話になりました。 今後とも、よろしくお願い致します。

litton101
質問者

補足

yamabejpさん、追加ご教示本当にありがとうございます。 今朝から、#7でご提示いただいた各SQLを本番環境に置き換え、 実行させていただいています。 とりあえず、phpMyAdmin上に#7にご提示いただいたSQL文を放り込んで みたのですが、サーバー考え込んだまま問い合わせ結果が出力されてきませんでした。 とりあえず、5つあるCREATE文から「TEMPORARY」をとって一つ一つテーブルを作成して みましたら、全て即刻クエリーが完了します。 結論、最後の「SELECT * FROM `地域マスター`,`FLG_TABLE`,`KIND_TABLE`・・・」 のところでつまづき、結果を出力しきれない(っぽい)ことがわかりました。 もしかしたら、SELECTの際に当方本番環境におけるWHERE条件がゆるいため、 無限ループみたいなことが起こってるのかもしれませんので原因について調査中です。 本当なら、「SELECTされましたー!ありがとうございました!!」といいたかった ところですが、解決御礼まで今しばらくお待ちください。 なお、本番環境に適用(CREATE)した結果は文末の通りで、 #5、#6でご提示いただいたような結果にはなっていると思います。 取り急ぎ、深謝&現状報告まで。 ■TABLE1 県ID 年月 KIND DATA 0001 200412 GNP 4348 0001 200501 GNP 3757 0001 200502 GNP 4361 0001 200503 GNP 6365 0001 200504 GNP 5245 0001 200505 GNP 4495 0001 200506 GNP 4294 0001 200507 GNP 5996 ■TEMP_PIVOD 年月 FLG 1 2 3 4 5 6 7 8 9 10 11 12 200412 去年 1 0 0 0 0 0 0 0 0 0 0 0 200501 去年 0 1 0 0 0 0 0 0 0 0 0 0 200502 去年 0 0 1 0 0 0 0 0 0 0 0 0 200503 去年 0 0 0 1 0 0 0 0 0 0 0 0 200504 去年 0 0 0 0 1 0 0 0 0 0 0 0 200505 去年 0 0 0 0 0 1 0 0 0 0 0 0 200506 去年 0 0 0 0 0 0 1 0 0 0 0 0 200507 去年 0 0 0 0 0 0 0 1 0 0 0 0 200508 去年 0 0 0 0 0 0 0 0 1 0 0 0 200509 去年 0 0 0 0 0 0 0 0 0 1 0 0 200510 去年 0 0 0 0 0 0 0 0 0 0 1 0 200511 去年 0 0 0 0 0 0 0 0 0 0 0 1 200603 今年 1 0 0 0 0 0 0 0 0 0 0 0 200604 今年 0 1 0 0 0 0 0 0 0 0 0 0 200605 今年 0 0 1 0 0 0 0 0 0 0 0 0 200606 今年 0 0 0 1 0 0 0 0 0 0 0 0 200607 今年 0 0 0 0 1 0 0 0 0 0 0 0 200608 今年 0 0 0 0 0 1 0 0 0 0 0 0 200609 今年 0 0 0 0 0 0 1 0 0 0 0 0 200610 今年 0 0 0 0 0 0 0 1 0 0 0 0 200611 今年 0 0 0 0 0 0 0 0 1 0 0 0 200612 今年 0 0 0 0 0 0 0 0 0 1 0 0 200701 今年 0 0 0 0 0 0 0 0 0 0 1 0 200702 今年 0 0 0 0 0 0 0 0 0 0 0 1 ■TABLE2 県ID KIND FLG 1 2 3 4 5 6 7 8 9 10 11 12 0001 GNP 今年 5598 4953 5018 0 0 0 0 0 0 0 0 0 0001 人口 今年 720 617 611 0 0 0 0 0 0 0 0 0 0001 GNP 去年 5069 4810 4832 5287 5108 4497 5323 5201 5457 4831 5769 5069 0001 人口 去年 648 619 617 667 646 587 693 671 709 624 747 680 ■FLG_TABLE FLG 去年 今年 ■KIND TABLE KIND GNP 人口

関連する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