• ベストアンサー
  • 暇なときにでも

複数のテーブルの集計

あけましておめでとうございます。よろしくお願いします。例えばPHPを利用して二つの店舗で好きなブランドのアンケートを取りそれぞれテーブルに格納するとします。 tenpoa_tbl id,bland tenpob_tbl id,bland2 count(bland)とcount(bland2)の合計値をポイントが高い順に(たとえば店舗Aの順位が シャネル10 プラダ  6 グッチ  3 B店舗の順位が シャネル 8 ビトン  7 グッチ  2 合計がシャネル 18    ビトン  7    プラダ  6    グッチ  5 こんな感じで集計したいのですが分かる方いらしゃいますか?   

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数107
  • ありがとう数2

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

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

MySQLで質問するときはバージョン情報をかきましょう。 動作がバージョンによってぜんぜん異なります。 古いバージョンではサブクエリーやunionは使えません。 その場合はテンポラリテーブルなどをつかって1度データを 統合して集計するといいでしょう。 create temporary table tmp select bland from tenpoa_tbl; insert into tmp select bland2 as bland from tenpob_tbl; select bland,count(*) as sum from tmp group by bland order by sum desc; メモリに余裕があればheapで処理する方が高速だと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。また宜しくお願いします。

関連するQ&A

  • テーブルの集計値を別テーブルに更新したいのですが

    mysql+PHPを利用していますが、表記の件で数日間悩んでおります。 実際に可能な操作かどうかもわかりません。 よいお知恵があったら教えてください。 下のようなテーブルがそれぞれあります。 table1 ID・得意先コード・受注内容・受注金額 1・   28  ・ xxxx ・ 10000 2・   32  ・ aaaa ・  5000 3・   28  ・ YYYY ・ 20000 4・   15  ・ tttt ・ 15000 5・   32  ・ kkkk ・  3000 (得意先コードはtable2のIDです) table2 ID・得意先名・受注金額合計 15・ BBB・ 28・ CCC・ 32・ DDD・ PHPファイルを実行する度に、 「table1」の「受注金額」を「得意先コード」ごとに集計した各値を、「table2」の各「受注金額合計」にそれぞれ更新していきたいと思っています。 色々調べたところ以下の構文が紹介されていたので試してみました。 Update table2 set 受注金額合計 = (select sum(受注金額) from table1 INNER JOIN table2 ON table1.得意先コード = table2.ID) すると「#1064 - You have an error in your SQL syntax」というエラーが出てしまいました。select以降の構文が良くないらしいのですが、私の書き方が悪いのか、それすらもわからない状態です。 MySQLは4.0.24、PHPは4。レンタルサーバーを利用しています。 なにとぞよろしくお願いします。

  • 複数テーブルの集計その2

    お世話になります。 先日テーブルの集計について教えていただき、下記集計結果を取得することができたのですが、 新たに自由形50~平泳ぎ50までの合計を追加したいのです。(一人で4種目参加する場合は4と数える) テーブル1 AreaID   AreaName --------------------- 1 北海道 2 東北 テーブル3 ID AreaID   Name  Item1   Item2  Item3 Item4 --------------------------------------------------------- 1   2    鈴木    2    1    4     3 2   1    田中    1    2    null   null 3   2    伊藤    3    null   2    4  「集計結果」       参加人数 自由形50 自由形100 背泳ぎ50 平泳ぎ50  追加部分 --------------------------------------------------------------- 北海道     1     1       1      0      0       2 東北      2     1       2      2      2       7   $sql="select AreaName, count(distinct ID) 参加人数, count(case when Item=1 then 1 else null end) as 自由形50, ・・・略 from t1 as x left join (select ID,AreaID,1 as Item from t3 where Item1=1 or Item2=1 or Item3=1 or Item4=1 union all select ID,AreaID,2 as Item from t3 where Item1=2 or Item2=2 or Item3=2 or Item4=2 ) as y on x.AreaID=y.AreaID group by AreaName order by x.AreaID というようにおしえていただきました。 null以外を取得するSQLをカウントとselectに追加すればいいのかと思い試したのですが期待した値を取得できません。 count(case when Item=AAA then 1 else null end) as abc,と union all select ID,AreaID,AAA as Item from テーブル3 where ItemID1<>'' or ItemID2<>'' or ItemID3<>'' or ItemID4<>'' or (ItemID1<>'' and ItemID2<>'') ・・・ バージョンはMySQL4.1.18です。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 高額ブランド

    世界レベルの有名ブランドの高額?の順位はヴィトン=シャネル>グッチ=エルメス>コーチ=プラダ=カルティエ という風に認識しています。 このような順位に詳しい方もしいらっしゃったら訂正してください!他のブランドが入っててもかまいません。ディオールなど あと男性ファッションブランドでは ナンバーナイン>アンダーカバーイズム>ハリウッド>APE だと認識しています。こちらのほうもアドバイスください!

その他の回答 (1)

  • 回答No.1

店舗毎に表を分ける意味があるのですか? 店舗コードか店舗名を、表の中に持てばいいのでは? そうすることで、合計は簡単に求められます。 店舗毎に表を分けるなら、仮に店舗数の増減があれば、SQLも変えることになりますよ? 店舗別に表を分けるなら、一店舗のブランド毎の合計を求めるSQLは、以下のようになります。 select bland,count(*) from ta group by bland order by 2 desc 仮に表を一つにし、店舗名を持つなら、以下のようなSQLになります。 select shop,bland,count(*) from t1 group by shop,bland order by 1,3 desc 一つのSQLで、結果を得たいという考えなのでしょうか? unionで結合する方法が考えられますが、ver 5.0では、unionとorder byを組み合わせた場合、バグがあるようで、下に結合した表のデータの並び替えが正しく行われないようです。 一表にした場合、合計を求めるのは、以下のようなSQLになります。 select bland,count(*) from t1 group by bland order by 2 desc

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。また宜しくお願いします。

関連するQ&A

  • MySQLでWHEN句のサブクエリ中にて

    MySQL ver.5.0.95です。 PHPからSQL文を作ってDBへインサートしているのですが 重複した値が合った場合はupdateするように書いています。 TBL1には |id   |string   |count 1    aaa    0 2    bbb    3 3    ccc    1 TBL2には |id2    |string2    |count2 1      aaa      0 2      bbb      2 3      ccc      1 実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。 このとき、TBL1のそれぞれをインサート若しくはアップデートするのに TBL2の同一IDのものの、count2の状態によって場合分けしたく 同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが insert into TBL1 values (1, "aaa", 3), (2, "bbb", 3), (3, "ccc", 3), (4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END; #1064 - You have an error in your SQL syntax;というエラーになって出来ません。 WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。 例えば決め撃ちで1つ1つ書くと通ります。 insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END; これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか? あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、 変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。 まとめると速くなることはあるでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLで複数のSELECT文を1文にまとめたい

    以下のようなテーブル table1 があります。 ******************* table1 ******************* Name, Kyouka, Score, ID ******************* 山田, 国語, 92, 10001 鈴木, 国語, 71, 10002 田中, 国語, 89, 10003 山田, 数学, 65, 10004 鈴木, 数学, 69, 10005 杉田, 英語, 96, 10006 山田, 英語, 63, 10007 田中, 英語, 76, 10008 ... ******************* カラムIDはPRIMARYを指定しています。 カラムScoreはインデックスを作成しています。 このテーブルで、「IDと教科」を指定したときに、以下の2つのデータを得たいと思っています。 (1) IDに対応する名前と、その教科中の順位 (2) その教科のレコード数 具体例としては、例えば「ID=10001、教科=国語」を指定したときに、「山田、3人中1位」というような情報が得たいです。 (「ID=10001、教科=英語」のようなおかしな組み合わせは指定しないようになっています。) (1) は、以下のようにして名前と順位を得る事が出来ました。 SELECT Name, (SELECT COUNT(*) + 1 FROM table1 b WHERE b.Score > a.Score and Kyouka='国語') AS rank FROM table1 a WHERE ID='10001' ORDER BY Score DESC; (2)は、以下のようにして特定の教科のレコード数を得る事が出来ました。 SELECT COUNT(*) FROM table1 WHERE Kyouka='国語'; しかし、実際にはレコード数が大量にあり、頻繁にこの検索を実行する予定なので、負荷が心配です。 出来るだけサーバーの負荷を減らすために、1回のSELECT文の実行で(1)と(2)をどちらも実現できるような方法はないでしょうか。 また、このテーブルでインデックスを作成しているのはIDとScoreのみですが、より負荷を減らすにはKyoukaにもインデックスを作成した方が良いでしょうか。 何卒、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • テーブルの行削除について

    以前、テーブルの行追加について教えてもらい出来ましたが 逆に、追加された行を削除する方法を教えてください。 <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=Shift_JIS"> <TITLE>行追加・削除</TITLE> </HEAD> <BODY> <TABLE BORDER="1" id="Table1"> <TR> <TH>タイトルA</TH> <TH>タイトルB</TH> </TR> <TR> <TD><INPUT TYPE="text" SIZE="18" MAXLENGTH="18" NAME="A" VALUE=""></TD> <TD><INPUT TYPE="text" SIZE="18" MAXLENGTH="18" NAME="B" VALUE=""></TD> </TR> </TABLE> <INPUT TYPE="button" VALUE="行追加" onclick="addRow()"> <INPUT TYPE="button" VALUE="行削除"> <script language="JavaScript"> function addRow() { var tbl = document.getElementById("Table1").firstChild; if (!tbl.tagName) { tbl = document.getElementById("Table1"); } var tr = document.createElement("tr"); var td1 = document.createElement("td"); var tx1 = document.createElement("input"); tx1.setAttribute("type","text"); tx1.setAttribute("size","18"); tx1.setAttribute("maxlength","18"); tx1.setAttribute("name","Cn"); tx1.setAttribute("value",""); td1.appendChild(tx1); var td2 = document.createElement("td"); var tx2 = document.createElement("input"); tx2.setAttribute("type","text"); tx2.setAttribute("size","18"); tx2.setAttribute("maxlength","18"); tx2.setAttribute("name","Cn"); tx2.setAttribute("value",""); td2.appendChild(tx2); tr.appendChild(td1); tr.appendChild(td2); tbl.appendChild(tr); } </script> </BODY> </HTML>

  • 複数テーブル間の集計

    以下のようなテーブル構造のデータベースですが --- 社員tb  社員ID  社員名 地区tb  地区ID  地区名 成績tb  成績ID  社員ID  地区ID  営業成績 --- 「地区ごとの成績トップ社員の一覧」を出そうとして SELECT  社員tb.社員ID,  社員tb.社員名,  地区tb.地区ID,  地区tb.地区名,  max(成績tb.営業成績) FROM  社員tb,地区tb,成績tb WHERE  社員tb.社員ID = 成績tb.社員ID  AND 地区tb.地区ID = 成績tb.地区ID GROUP BY  地区ID というSQL文を実行したら なぜか社員名フィールドがすべて特定の社員しか表示されない (Bが地区トップのはずなのにAと表示される等)状態です。 どなたか解決法をご教示下さい… ちなみにバージョンは 5.0.33 です。

    • ベストアンサー
    • MySQL
  • 複数テーブルの集計

    お世話になっています。 複数テーブルの集計がわからないので質問させてください。 テーブル3のItem1~4にはテーブル2のItemIDを登録します。 エリア毎の参加人数をcsvデータを出力させたいです。 テーブル3においてテーブル2のItemIDが4つあるので、一人に対して4行必要なのかと思いましたが、テーブルの変更ができません。 テーブルの結合まではできましたがその後ができません。 テーブルの変更ができませんので、結合するためにテーブル2の構造とデータが同じテーブルを他に3つ作成しています。 どうぞよろしくお願いします。 テーブル1 AreaID   AreaName --------------------- 1 北海道 2 東北 3 関東 4 北陸 テーブル2 ItemID ItemName --------------------- 1 自由形50 2 自由形100 3 背泳ぎ50 4 平泳ぎ50 テーブル3 ID AreaID   Name  Item1   Item2  Item3 Item4 --------------------------------------------------------- 1   2    鈴木    2    1    4     3 2   3    佐藤    1    null   3    null 3   1    田中    1    2    null   null 4   2    伊藤    3    null   2    4  5   3    川村    null   2    3    null 「集計結果」       参加人数 自由形50 自由形100 背泳ぎ50 平泳ぎ50 --------------------------------------------------------------- 北海道    1     1     1     0     0  東北     2     1     2     2     2   関東     2     1     1     2     0   北陸     0     0     0     0     0

    • ベストアンサー
    • MySQL
  • 複数のテーブルに跨る集計

    こんばんは。お世話になっております。 テーブル(member) id id_name name  1 takashi さんま 2 sayuri きゅうり 3 akemi  とまと テーブル(data) id date 2 07-1-20 3 07-1-20 2 07-1-20 1 07-1-21 2 07-1-21 3 07-1-21 以上のようなテーブルがあり、下記のように、テーブルdataのidをカウントし、多いもの順に結果を表示させたいのですが、このような場合のソースが分かりません。 結果 きゅうり 3件 とまと  2件 さんま  1件 似たような質問をされている方も過去に多くあるようですが、私のケースとどれが適しているかさえも分からず投函させていただきました。 お忙しい中恐縮ですが、説明のあるサイト、またはアドバイスなどご指導いただけたら幸いです。宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 複数のテーブルに跨る集計その2

    こんにちは。お世話になっております。 http://oshiete1.goo.ne.jp/qa2684315.html 昨日、上記ページより投函させていただきましたが、その時は解決できたものの、その後の新たなソースの追加で上記ページにある、検索結果表示にある、各々の「件数表示」が出来なくなってしまいました。 当初は単に追加したソースが邪魔してる?などという思いから、色々と設定を変えているものの上手く行かず、現在なんとか件数表示を表示する事は出来たものの、繰返処理(while)の中に新たに、 $id = $row['id']; $sql = "select id FROM data WHERE id = '$id'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); echo $rows; なんて、入れることで対処出来ましたが、この対処法に自信がなく、改めて諸先輩方々にヒントだけでもご指導いただければと投函させて頂きました。 お忙しい中恐縮ですが宜しくお願い致します。 ※通常の?検索ソースは上記ページでご教授いただいた select M.id, M.name, count(M.name) as count from data D inner join member M on M.id = D.id group by M.name, M.id order by count desc を参考にさせていただいております。

    • ベストアンサー
    • MySQL
  • メンズ財布

    20代前半の兄に財布のプレゼントを考えています。 あまりごつくなくシンプルで良い物を探しています。 ネットで検索していくつかに絞ったのですが ここから1つに決められません(×_×;) みなさんの意見を参考にさせていただきたいので この中からどれがいいか1つ選んで理由を教えてもらえないでしょうかm(_ _)m (1)グッチ http://www.e-na.co.jp/1st/product/index.asp?prd_id=131927bk 一番の候補が今のところこれです。 男の人が持つには、ラインがグッチぽくていやらしいでしょうか。 それと、あまりファッションに無頓着な兄なのでグッチに名前負けしそうというのも少し… (2)ダンヒル http://www.i-piazza.co.jp/shop/html/d291.html 無難なところで 無難すぎるような気も… (3)カルバン・クライン http://www.store-mix.com/ko-bai/product.php?act=&pid=130952&oid=7649&hid=o7649p130952a32505&u=&afid=0&ocat=1&pic=other_pic 友達にオススメされました 私は初めて聞くブランドなのですが知名度的にはどうなのでしょうか   (4)プラダ ・http://www.i-piazza.co.jp/shop/html/p1327.html ・http://water.s10.xrea.com/brand/p620.html 無難に… 使用されたことがある方がいましたら 使用感など感想を教えてください! あと、ポールスミスの小銭入れ付きで良い物がないか探しています この他にもオススメがありましたら情報をお願いします!

  • 複数テーブルからのカウント集計

    初めて、投稿させて頂きます。 カルテテーブルに登録されたデータより、スタッフごとにどのサービスを何回対応したかを出力したいのですが、経験が浅く考え込んでいます。 また、日付の制限も指定したいです。 何卒、アドバイスをお願い致します。 MySQL 4.0.24-standardを使用しています。 カルテテーブル(chart_table) --------------------------------------- staff | date | service1 | service2 | service3 | service4 | 1 2007-01-27 1 2 0 0 3 2007-02-07 0 0 3 4 2 2007-03-04 1 0 3 4 スタッフテーブル(staff_table) --------------------------------------- no | id | 1 佐藤 2 鈴木 3 田中 サービステーブル(service_table) --------------------------------------- no | name | 1 サービスA 2 サービスB 3 サービスC 4 サービスD 結果(2007-01 ~ 2007-03) ---------------------------------------       佐藤 | 鈴木 | 田中 | サービスA 1 1 0 サービスB 1 0 0 サービスC 0 1 1 サービスD 0 1 1

    • ベストアンサー
    • MySQL
  • 複数テーブルの集計結果の問い合わせ

    mysqlで、例えば 客table id|氏名 --|--- 01|あ 02|い 03|う 注文table 客|商品 --|--- 03|A 02|B 03|C 01|B 苦情table 客|内容 --|--- 01|aaa 01|bbb 02|ccc 01|ddd というテーブルがあるときに、結果として id|氏名|注文数|苦情数 --|----|------|------ 01|あ |1   |3 02|い |1   |1 03|う |2   |0 という表を得るには、どういうsql文を書けばよいのでしょうか? もし苦情数なしで注文数だけであれば、 SELECT 客.id, 客.氏名, COUNT(*) FROM 客 LEFT JOIN 注文 ON 注文.客 = 客.id GROUP BY 注文.客; で可能だと思うのですが、そこから先が分かりません。そもそも一行のsql文で可能なのでしょうか?

    • ベストアンサー
    • MySQL