- ベストアンサー
複数行のグループ集計とカウント
下記の内容のようにグループ化してその後さらにグループ化してカウントを取る方法をお教えください。出来れば一回の処理で終わる方法が知りたいです。 大変お手数ですがよろしくお願いします。 例 t_id t1 t2 1 a 1 2 a 1 3 a 2 4 a 3 5 b 4 6 b 4 7 ETC 5 ※1行目がフィールド名で2行目以降がデータです 1.上記の例のテーブルのt2のフィールドをグループ化し同じ数値をひとまとめにします >SELECT * FROM テーブル名 GROUP BY t2; t_id t1 t2 1 a 1 3 a 2 4 a 3 5 b 4 7 ETC 5 2.この状態でt1のフィールドをグループ化してt1のカテゴリーのカウントをとり以下のような感じの結果を出したいと考えています。 t1 Count a 3 b 1 ETC 1 このような処理を表示させるようにするにはどのようにしたらよろしいのでしょうかお教えください。 環境はmysql5.0を使用しております。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
この場合深く考えずに、以下のような処理が効率的です SELECT t1,COUNT(DISTINCT t2) AS Count FROM テーブル名 GROUP BY t1
その他の回答 (1)
- chukenkenkou
- ベストアンサー率43% (833/1926)
>グループ化してその後さらにグループ化してカウントを取る その言葉通り、インラインビュー内でグループ化し、それを外側のクエリでグループ化すればいいだけです。 >1.上記の例のテーブルのt2のフィールドをグループ化し同じ数値をひとまとめに >します >SELECT * FROM テーブル名 GROUP BY t2; >t_id t1 t2 > 1 a 1 > 3 a 2 > 4 a 3 > 5 b 4 > 7 ETC 5 SQLの使い方を間違っています。 「group by t2」とした場合、このケースでは、t_id、t1列の値は保証されません。 http://dev.mysql.com/doc/refman/4.1/ja/group-by-hidden-fields.html 「group by t2」で、t1の値も各グループ毎で一意になるのでしょうか? 少なくとも、t_idは一意にならないので、MySQLではエラーにはなりません(※1)が、結果は保証されません。 ※1 標準SQLや殆どのRDBMSでは、group by指定時にselect句で指定できるのは次のようなもののみ (1)group byで指定した列 (2)max、countなどの集計(集合関数) (3)定数 MySQLでは、この部分に拡張仕様があり、次のようなSQLを書ける select c1, c2, -- ここが拡張仕様 max(c3) from t1 group by c1 標準SQLや殆どのRDBMSでは、select句でc2列を指定不可。 しかし、MySQLでは、「c1でグループ化した結果、c2も一意になるなら指定してよい。ただし、c2が一意にならないなら結果を保証しない」としています。
お礼
chukenkenkou早速の質問のご返事ありがとうございます。 すいません。 MYSQLにそんなにはたけていないので、chukenkenkouのいわれていることはなんとなくわかるのですが、この内容を実現したい場合はどのようにおこなうのかもう少し具体的にお教えしていただいてよろしいでしょうか。 すいません。よろしくお願いします。
補足
chukenkenkouさんへ この回答へのお礼 >この内容を実現したい場合はどのようにおこなうのかもう少し具体的にお教えしていただいてよろしいでしょうか。 すいません。よろしくお願いします。 とコメントさせていただきましたがすいません。忘れてください。 yambejpさんのコメントを見落とした状態で、chukenkenkouさんのコメントを読ませていただいたので 私の頭がこんがらがってしまいました。 もう一度、yambejpさん、chukenkenkouさんの順番で読ませてもらったら内容をしっかり把握することが出来ました。 問題解決です。 本当にありがとうございました。
お礼
yambejpさん 回答ありがとうございました。 なるほど。こうすればいいのですね。 問題が解決しました。 ありがとうございます。 yambejpさん、chukenkenkouさん 本当にありがとうございました。 私の勘違いと教えてGooの使い方が下手なことからお礼、補足の記載の仕方が変になってしましたことを深くお詫びします。 本当にありがとうございました。