• ベストアンサー

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

http://oshiete1.goo.ne.jp/kotaeru.php3?q=2256727 のさらに続きです。 #1、#2さんのご助言&プログラム例を、自分の環境に適用したいのですが、 テーブル構造の例示の仕方が悪かったため、どうしても自分の環境に 置き換えて適用することができませんでした。 文末の3テーブルに対し、県IDが3500種類、この3500行の右に、 ・県名 ・去年のGDPを時系列に12か月分 ・去年の人口 〃 ・今年のGDP 〃 ・今年の人口 〃 …といった順序でCREATE TEMPORARY TABLEしたいのですが、 CREATE TABLEして、データをSELECTしないことにはINSERTできないですよね? このあたりの関係がどうしてもわからず、挫折しかけたのですが、 3テーブルをエキスポートする度に、Excelでくっつけるのが面倒なのと、 何よりご教示下さった#1、#2さんのご好意を台無しにしたくなく、挫折したくありません。 県ごとにSUMで集計などせず、プレーンなデータをHTMLorTXT出力したいのですが… ■地域マスター 国ID 国名 県ID 県名 ――――――――――― C001 日本 001 東京 C001 日本 002 埼玉 C001 日本 003 千葉 C002 米国 004 バージニ C002 米国 005 ミネソタ C002 米国 006 カリフォ C003 中国 007 四川 C003 中国 008 広東 C003 中国 009 雲南 ■去年テーブル →2004年12月~2005年11月のGNPと人口を【収録済み】 県ID  年月 GNP 人口 ―――――――――――― 001 200412 100 30 001 200501 101 30 001 200502 103 31   :(略) 001 200511 106 34 002 200412 202 60 ■今年テーブル →2006年3月~2007年2月のGNPと人口を【収録中】 県ID  年月 GNP 人口 ―――――――――――― 001 200603 108 40 001 200604 109 44   :(略) 001 200702 NULL NULL 002 200603 230 50

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

  • ベストアンサー
  • 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 人口

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

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

#5のつづき さらにFLG(去年か今年を判断する)テーブルと、KIND( GNPか人工かを判断する)テーブルを用意ます 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`

全文を見る
すると、全ての回答が全文表示されます。
  • 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」のように出て、何も起こりません。 テンポラリテーブルっていうのは、そういうものなのですよね? とりあえず、今現在までに適用させていただいた部分はここまでです。 これから、続きをためさせていただきます。まずは御礼申し上げます。

全文を見る
すると、全ての回答が全文表示されます。
  • HTTP500
  • ベストアンサー率40% (2/5)
回答No.4

LEFT JOIN 今年テーブル ON (今年テーブル.県ID = 今年テーブル.県ID) ; もとい LEFT JOIN 今年テーブル ON ( 今年テーブル.県ID = 地域マスター.県ID) ;

全文を見る
すると、全ての回答が全文表示されます。
  • HTTP500
  • ベストアンサー率40% (2/5)
回答No.3

ごめんなさい 勘違いしてました テーブルのイメージはこうですよね? CREATE TEMPORARY TABLE ほげ ( 県名, 去年GNP, 去年人口, 今年GNP, 今年人口 ) ; であれば、 INSERT INTO ほげ SELECT 地域マスター.県名, 去年テーブル.GNP, 去年テーブル.人口, 今年テーブル.GNP, 今年テーブル.人口 FROM 地域マスター LEFT JOIN 去年テーブル ON (去年テーブル.県ID = 地域マスター.県ID) LEFT JOIN 今年テーブル ON (今年テーブル.県ID = 今年テーブル.県ID) ;

全文を見る
すると、全ての回答が全文表示されます。
  • HTTP500
  • ベストアンサー率40% (2/5)
回答No.2

質問の意図があまりよくわかってませんが (説明はおもいっきり端折ります、意味がわからない場合はご自分で調べることをおすすめします) CREATE TEMPORARY TABLE ほげ (...) ; INSERT INTO ほげ SELECT 地域マスター.県名, 去年テーブル.GNP, 去年テーブル.人口 FROM 去年テーブル INNER JOIN 地域マスター USING (県ID) ; INSERT INTO ほげ SELECT 地域マスター.県名, 今年テーブル.GNP, 今年テーブル.人口 FROM 今年テーブル INNER JOIN 地域マスター USING (県ID) ; ってやればよいのでは?

litton101
質問者

お礼

HTTP500さん、レスありがとうございました。 既存のレコードをINSERTするには一回それらをSELECTしなければ ならない???とか、そのあたりが謎の1点でしたが、 「INSERT INTO TABLE名 SELECT ...」という書き方ができるのですね、 これは効率的ですし、かなり納得です。 わたしは業者さんが設計したDBをSELECTすることくらいしか やったことがなくで、TABLE操作はあまり経験なかったですが、 なかなか奥が深いですね。 今後ともよろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

去年のGDP、去年の人口、今年のGDP、今年の人口の 順にSQLで抽出して、順次テンポラリに流し込んで 最後にテンポラリをSELECTすればよいのでは? テンポラリテーブルにはソート用のフィールドを ひとつつくっておけば表示も楽でしょう

litton101
質問者

補足

yamabejpさん、いつもお世話になります。 yamabejpさんの目にとまってよかったです。 > 去年のGDP、去年の人口、今年のGDP、今年の人口の > 順にSQLで抽出して、順次テンポラリに流し込んで > 最後にテンポラリをSELECTすればよいのでは? というアドバイスを受け、次のように解釈しましたが、 雰囲気的にはあってますでしょうか・・・ とても動く気がしませんが。。うう。すみません。 <?php $link=mysql_connect('host','user','pass'); mysql_select_db('db',$link); //STEP1 TEMPテーブル作成 $sql0 = "CREATE TEMPORARY TABLE `TEMP_PIVOD` (`県名` VARCHAR(6),`去年GNP12` INT,`去年GNP01` INT,■中略■`今年人口02` INT)"; $sql1 = "select * from 地域マスター order by 県ID"; $sql2 = "select * from 去年テーブル"; $sql3 = "select * from 今年テーブル"; $rst1 = mysql_query($sql1, $link); $rst2 = mysql_query($sql2, $link); $rst3 = mysql_query($sql3, $link); $recmax1 = mysql_num_rows($rst1); $recmax2 = mysql_num_rows($rst2); $recmax3 = mysql_num_rows($rst3); //STEP2 SELECTした地域マスターのレコードをTEMPテーブルにINSERT for ($recnum1 = 0; $recnum1 < $recmax1; $recnum1++) { $col = mysql_fetch_array($rst1); $sql4 = "insert into TEMP_PIVOD (`県名`,`県ID`) values ('$col["県名"]',$col["県ID"])"; mysql_query($sql4, $link); } //STEP3 SELECTした去年テーブルのレコードをTEMPテーブルにINSERT for ($recnum2 = 0; $recnum2 < $recmax2; $recnum2++) { $col = mysql_fetch_array($rst2); $sql5 = "insert into TEMP_PIVOD (`県名`,`去年GNP12`T,■中略■`去年人口11`) values ('$col["県名"]',$col["GNP"],$col["人口"])"; mysql_query($sql4, $link); } //STEP4 SELECTした今年テーブルのレコードをTEMPテーブルにINSERT for ($recnum3 = 0; $recnum3 < $recmax3; $recnum3++) { $col = mysql_fetch_array($rst3); $sql6 = "insert into TEMP_PIVOD (`県名`,`今年GNP03`T,■中略■`今年人口02`) values ('$col["県名"]',$col["GNP"],$col["人口"])"; mysql_query($sql3, $link); } $con1 = mysql_close($con); $con2 = mysql_close($con); $con3 = mysql_close($con); //STEP5 sql7 = "select * from TEMP_PIVOD"; //以下、SELECTしたTEMP_PIVODのレコードを表示 ?>

全文を見る
すると、全ての回答が全文表示されます。

関連する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
TR8630を使っています
このQ&Aのポイント
  • MPドライバーのインストールができません
  • PCはWindows7です
  • キヤノン製品についての質問です
回答を見る