GROUP BYの集計結果をさらにGROUP?

このQ&Aのポイント
  • 質問文章では、GROUP BYを使用してデータを集計した結果をさらにGROUPしたいという要望があります。
  • 具体的には、同じIDをまとめた結果から工場の数をカウントしたいとのことです。
  • 現在の質問文章ではGROUP BYを使用して集計していますが、他の方法も検討している状況です。
回答を見る
  • ベストアンサー

GROUP BY の集計結果をさらにGROUP?

下記ようなのデータベースを使い、GROUP BYで、 +------+-----+-------+ │ID  │工場│品名 │ +------+-----+-------+ │30001│愛知│チョコ│ +------+-----+-------+ │30001│愛知│アメ │ +------+-----+-------+ │40002│島根│ポテチ│ +------+-----+-------+ │40002│島根│焼そば│ +------+-----+-------+ │50001│愛知│餃子 │ +------+-----+-------+ ↓↓↓↓↓↓↓↓↓↓↓↓ 同じIDをまとめて表示しています。 +------+-----+---------------+ │ID  │工場│品名       │ +------+-----+---------------+ │30001│愛知│チョコ/アメ   │ +------+-----+---------------+ │40002│島根│ポテチ/焼そば │ +------+-----+---------------+ │50001│愛知│餃子       │ +------+-----+---------------+ この結果からさらに工場の数をカウントしたいのですが、 +-----+-----+------------+ │工場│件数│ID      │ +-----+-----+------------+ │愛知│2件 │30001/50001│ +------+----+------------+ │島根│1件 │40002    │ +------+----+------------+ ご存じの方いらっしゃいましたら、ご教授お願いいたします。 また、集計はGROUP BYしか扱ったことないのですが他の方法が必要なのでしょうか。 ヒントだけでもあれば・・・と思っています、宜しくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

> この結果からさらに工場の数をカウントしたいのですが、 例示されている表からは、工場ごとのIDの数をカウントしている様に見えるのですが・・・。 もしそうだとしたら、工場でグループ化して DISTINCT id をカウントしても良いかと。 例) ------------------------------------ SELECT 工場, COUNT(DISTINCT id), GROUP_CONCAT(DISTINCT id ORDER BY id SEPARATOR '/') FROM ○○テーブル GROUP BY 工場; ---------------------------------------- http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html

rabbit-kimura
質問者

お礼

無事思い通りの結果にたどり着けました!! ありがとうございました!!! 早く結果を得られたため#2さんをベストアンサーとさせていただきます。 #1さんのご回答も、MySQLを勉強するものとしては、大変役にたちました!!

rabbit-kimura
質問者

補足

>>例示されている表からは、工場ごとのIDの数をカウントしている様に見えるのですが・・・。 あああ!!! 考えすぎて、固まっていました・・・すいませんっ!!! そう考えるべきですね、ありがとうございます!!! 回答ありがとうございます!! 試させて頂いた後、またお礼の方入力させていただきます!!

その他の回答 (1)

回答No.1

GROUP BYでいいのではないでしょうか。 以下、参考になるかもです。勘違いだったらゴメンナサイ。 http://sasuke.main.jp/sqlgroupby.html

rabbit-kimura
質問者

補足

回答ありがとうございます!! 参考URL、すごくわかりやすいページでした!! こういうページにもなかなかたどり着けないので、 教えていただいて大変感謝しています!! 試させて頂いた後、またお礼の方入力させていただきます!!

関連するQ&A

  • PHP+MySQLで同じIDの備考項目を

    下記のようなことが可能か可能でないかだけでもわかればと思い、 質問させていただきました。 同じIDをもつレコードを +------+-----+-------+ │ID  │工場│品名 │ +------+-----+-------+ │30001│愛知│チョコ│ +------+-----+-------+ │30001│愛知│アメ │ +------+-----+-------+ │40002│島根│ポテチ│ +------+-----+-------+ │40002│島根│焼そば│ +------+-----+-------+ ↓↓↓↓↓↓↓↓↓↓↓↓ +------+-----+---------------+ │ID  │工場│品名       │ +------+-----+---------------+ │30001│愛知│チョコ/アメ   │ +------+-----+---------------+ │40002│島根│ポテチ/焼そば │ +------+-----+---------------+ (「/」でなくてもかまいません、同じレコード上にまとまればと思っています) このようなことは可能なのでしょうか? また、ご存じの方がいらっしゃいましたら、 何という命令文(?)になるのか、お教えいただければと思います。 調べても思った答えにたどり着けず、 調べ方も分からないため、質問させていただいた次第でございます。

    • ベストアンサー
    • PHP
  • group byにより集計した結果での名称取得方法

    次のようなテーブルがあったとして、一回のSQLで商品名称とその売上件数の一覧を作成することは可能なのでしょうか? 【売上テーブル】 ID 販売日 商品ID 0001 2011/01/01 1 0002 2011/01/01 2 0003 2011/01/03 1 0004 2011/01/10 1 0005 2011/01/12 2 ・・・ 【商品マスタ】 ID 商品名 1 りんご 2 みかん 3 いちご 【最終的に作成したい一覧】 商品名 件数 りんご 3 みかん 2 いちご 0 ※売上テーブルに存在しない商品についても、件数が0件として一覧に出力出来るようにしたいです。 select 商品ID from 売上テーブル group by 商品ID にて商品ID毎の件数を算出し、それとは別に select ID,商品名 from 商品マスタ として、商品IDと名称のリストを取得後、アプリにてこれらの情報を突き合わせれば実現できるのは分かるのですが、これらの処理を一回のSQLにまとめることは可能なのでしょうか? よろしくお願いします。

  • GROUP BYによる集計後のソートの高速化にアイデアはないでしょうか?

    ウェブサービスはいろいろ作ったことはあるのですが、分析系は作ったことがなく、DB構造について悩んでるところであります。 現在の課題は、商品ごとの売り上げ集計後に、それをランキング表示して表示する、というところなんですが、 select 商品ID,SUM(売り上げ)as`sales` from 売り上げテーブル group by 商品ID order by sales DESC limit 0,30 というものですが、やはり sales にインデックスが使えないのでtemporary table と file sort がでてきて遅くなってしまいます。 order by をはずすとやはり高速にレスポンスは返ってきます。 日別、月別、などのサマリーテーブルは作ってはいるのですが、単月ではなく、複数月指定での集計だとサマリーはないので集計をしないといけなくなります。 基本的なことなんだと思いますが、諸先輩方はどういったやり方で解決されておられるのでしょうか? なお、試験段階の現在は、売り上げテーブルには400万件、商品データは6万件あります。ですので、order by をはずした場合、6万件ほどがヒットし、それを(file sortで)並び替えてる状態だと思います。

  • GROUP BYを使用したCOUNT

    いつもお世話になっております。 現在下記のようなSQLを発行していまして、 件数を取得したいのですが、取得データの結果が 0件以外の時は良いのですが、0件の時は 「レコードが選択されませんでした」と表示されてしまいます。 何とか0件で表示できないでしょうか? SELECT COUNT(*) FROM T_M_MAKER HAVING MAKER_CD = '010' GROUP BY MAKER_CD 苦し紛れに SELECT DECODE(COUNT(*),'',0,COUNT(*)) FROM T_M_MAKER HAVING MAKER_CD = '010' GROUP BY MAKER_CD というのもやってみましたが、結果は一緒でした。 どなたかお分かりになる方、回答をお願いします。

  • LEFT JOIN と GROUP BY

    こんにちは。 以下の2つのテーブルを結合して、 subcategory_item_idごとのアンケート数を取得したいと思っております。 サブカテゴリー項目テーブル subcategory_item_id category_id subcategory_id subcategory_item_name content image_url アンケート詳細テーブル enquete_detail_id enquete_id store_id category_id subcategory_id subcategory_item_id 試しに作成した以下のSQL文でMySQLで実行したところ、アンケート詳細テーブルにsubcategory_item_idが含まれていない場合も件数0のレコードとして取得したいのですが、うまく取得できませんでした。 select sci.subcategory_item_id, sci.subcategory_item_name, count(ed.enquete_detail_id) c from subcategory_item sci left join enquete_detail ed on (ed.subcategory_item_id = sci.subcategory_item_id) group by ed.subcategory_item_id お手数をおかけしますが、ご教授いただけると助かります。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 複数表での集計値について

    以下のようなテーブル構造。SQLで 集計値を求めたいのですがCNTの値が tableCの件数を取得してしまいます。 (取得したいのはtableA.ID毎のtableB.ID2の件数) 宜しくお願いします。 ・tableA ------------- ID ------------- ・tableB ------------- ID | ID2 ------------- ・tableC ------------- ID2 | TIME ------------- SELECT tableA.ID ,SUM(tableC.TIME) AS TIME ,COUNT(tableB.ID2) AS CNT FROM tableA,tableB,tableC WHERE tableA.ID = tableB.ID AND tableB.ID2 = tableC.ID2 GROUP BY tableA.ID

    • ベストアンサー
    • MySQL
  • アクセスクエリで特定のみをグループ化

     いつもお世話になっております。  Access2007を使用しています。  さて、アクセスのクエリにおいて、特定のデータだけグループ化したいのですが、やり方が分かりません。理想は、下記例のとおりです。 【例】 テーブル名:T_地区 ID 地区名 会費 1  A   100 2  A   100 3  B   100 4  C   100 5  C   100 6  D   100 7  D   100 8  E   100 9  E   100 10 E   100 クエリ名:Q_地区_グループ化 IDの件数 地区名(グループ化) 会費の合計 2件    A          200 1件    B          100 1件    C          100 1件    C          100 2件    D          200 3件    E          300 ※Cは同名ですが、別々の地区となるため、C地区のみグループ化ならないようにしたいです。  どうかご教示を、よろしくお願いいたします。

  • このMysql文の結果をこうしたい…

    こんにちわ。PHPとMysqlで色々やろうとしている者です… すっごい初心者です。 こんな感じのテーブルがあって… tagsテーブル [int id(PK)(A_I)][varchar tag(index)][int u_id] 1、うどん、5 2、そば、5 3、うどん、2 4、ラーメン、2 5、そうめん、1 6、そば、3 ....(つづく) こんな文があります… SELECT u_id, count(CASE WHEN tag = "うどん" or tag = "そば" THEN 1 ELSE NULL END ) AS `agr` FROM tags GROUP BY u_id ORDER BY agr DESC 結果は [u_id][agr] 5、2 8、2 4、1 3、0 ....(つづく) tagが「うどん」or「そば」のu_idを集計して多い順にソートするんですが これの結果を「うどん」and「そば」の結果だけを出力したい(この場合agrの結果2のみ) …要するにtagをandで検索したいという事です… 回答よろしければお願いします…

    • ベストアンサー
    • MySQL
  • 配列データのグループ別け

    こんばんは。お世話になっております。 下記のような配列があり、各データの先頭にある番号(02_01とか)をグループごとに別けてカウントしたいのですが、この場合どのような手順で行ったら良いのでしょうか? Array ( [0] => 02_01 斉藤 ***@***.com [1] => 02_02 高木 ***@***.net [2] => 02_03 佐藤 ***@***.ne.jp [3] => 01_01 高橋 ***@***.com [4] => 02_01 鈴木 ***@***.co.jp [5] => 02_01 池田 ***@***.net [6] => 02_02 山田 ***@****.com ) ※上記各データのスペースは、全角スペースにて記述してますが、実際はタブ区切りとなっています。 やりたいこと、その1 以下のように、各グループ単位での件数を取得したい。 02_01 3件 02_02 2件 02_03 1件 01_01 1件 やりたいこと、その2 その1で別けた結果が何パターンあるか?を知りたく、上記例の場合、結果を4と返したい。 教えて君のようで恐縮ですが、色々と調べてはいるものの、DBでいうgroup by 句のような使い方が判らず、質問させていただきました。 お忙しい中恐縮ですが、アドバイスのほど宜しくお願い致します。

    • ベストアンサー
    • PHP
  • SQL GROUPで件数の一番多いレコードのみ取る

    SQL GROUPで件数の一番多いレコードのみ取る ORACLE10です。 次のようなテーブルがあります。 USER -----------テーブル名 ID,NAME,DATA----列名 1,A,any 1,A,any 1,B,any 2,C,any 3,D,any このテーブルから、IDをGROUPにして、さらに、一番使用頻度の多いNAMEを取得したいのです。 表示したいのは、IDとNAMEです。 つまり、取得結果例は次のようになります。 取得結果例 ID,NAME----列名 1,A 2,C 3,D SQL文をどのように作れば可能でしょうか? ちなみに、IDやNAMEのマスタテーブルはありません。 自分では、「(select ID, NAME, count(*) from USER group by ID, NAME) COUNT」で、COUNTを内部テーブルにして、グループ内で一番多いcount(*)をmaxで取得してみようかと思ったんですが、そこからアイデアが出ませんでした。