• ベストアンサー

複数行のグループ集計とカウント

下記の内容のようにグループ化してその後さらにグループ化してカウントを取る方法をお教えください。出来れば一回の処理で終わる方法が知りたいです。 大変お手数ですがよろしくお願いします。 例 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を使用しております。

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

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

この場合深く考えずに、以下のような処理が効率的です SELECT t1,COUNT(DISTINCT t2) AS Count FROM テーブル名 GROUP BY t1

kagorou
質問者

お礼

yambejpさん 回答ありがとうございました。 なるほど。こうすればいいのですね。 問題が解決しました。 ありがとうございます。 yambejpさん、chukenkenkouさん 本当にありがとうございました。 私の勘違いと教えてGooの使い方が下手なことからお礼、補足の記載の仕方が変になってしましたことを深くお詫びします。 本当にありがとうございました。

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

その他の回答 (1)

回答No.1

>グループ化してその後さらにグループ化してカウントを取る その言葉通り、インラインビュー内でグループ化し、それを外側のクエリでグループ化すればいいだけです。 >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が一意にならないなら結果を保証しない」としています。

kagorou
質問者

お礼

chukenkenkou早速の質問のご返事ありがとうございます。 すいません。 MYSQLにそんなにはたけていないので、chukenkenkouのいわれていることはなんとなくわかるのですが、この内容を実現したい場合はどのようにおこなうのかもう少し具体的にお教えしていただいてよろしいでしょうか。 すいません。よろしくお願いします。

kagorou
質問者

補足

chukenkenkouさんへ この回答へのお礼 >この内容を実現したい場合はどのようにおこなうのかもう少し具体的にお教えしていただいてよろしいでしょうか。 すいません。よろしくお願いします。 とコメントさせていただきましたがすいません。忘れてください。 yambejpさんのコメントを見落とした状態で、chukenkenkouさんのコメントを読ませていただいたので 私の頭がこんがらがってしまいました。 もう一度、yambejpさん、chukenkenkouさんの順番で読ませてもらったら内容をしっかり把握することが出来ました。 問題解決です。 本当にありがとうございました。

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

関連するQ&A

  • 複数行のグループ集計とカウント

    初歩的な質問で、既に質問されている内容でしたらすいません。 不動産のデータベースでひとつのテーブル内に、最寄り沿線が3つ記録されています。 3列のデータをまとめてグループ化し、沿線名ごとのカウントを取るにはどうすれば良いでしょうか?テーブルの詳細は、添付画像をご確認ください。 1列ごとのやり方はわかるのですが、3列まとめてカウントする方がわかりません。 どなたか教えて頂けませんでしょうか。

    • ベストアンサー
    • MySQL
  • グループ集計のカウントについて access2003

    テーブル1からクエリ結果1を得たいのですが、 どのようにすればよろしいでしょうか? テーブル NO Q1 Q2 A  3 2 A  2 2 A  1 3 B  2 2 B  1 2 クエリ結果 NO Q1A1 Q1A2 Q1A3 Q2A1 Q2A2 Q2A3  総数 A  0   1  1   0  2   0   3 B  1   1  0   0  2   0   2 NOの集計をグループ化し、 総数はフィールドを 総数: Count([Q1]) とすれば 表示できるのですが、中の6つのフィールドの設定が わかりません。 よろしくお願いいたします。 ------------- テーブルの説明 商品AとBに対するアンケートデータベース 質問文は2問(Q1とQ2)で1から3の3択 クエリ結果の説明 Q1A1は質問Q1で1と回答した人の数 総数は商品に対するレコード数

  • 複数フィールドの一括カウントはできませんか?

    MS-ACCESS2000です。 ID|field1 |field2|・・・ -------------------- 1 |10 |30 | 2 |20 |10 | 3 |30 |20 | 4 |10 |20 | 5 |30 |20 | ・ |10 |30 | ・ |30 |20 | ・ |10 |10 | 上記のようなテーブルについて、各フィールド毎の、 10、20、30それぞれの件数カウントしたいんです。 得たい結果としては、以下のようなものです。  |field1|field2|・・・ -------------------- 10|5(件) |30(件)| 20|11(件)|9(件) | 30|7(件) |22(件)| このフィールド数ですが、全部で200ありまして、 以前ここの回答で拝見した、 SELECT point, count(*) FROM Point GROUP BY point.point; ではとても処理できそうにないもので・・・。 どなたか、お知恵を頂ければありがたいです。 どうか、よろしくお願い致します。

  • 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で取得してみようかと思ったんですが、そこからアイデアが出ませんでした。

  • テーブルごとのカウント

    PHP5.2+mysql 5.0.45で開発を行っております。 SQLに関する質問なのですが 以下のことが可能かどうかご教授いただきたく。 4つのテーブルがあります。 (例は適当です。項目の名称等は無視してください。) テーブルA ID Name Kana テーブルB ID NameID Pref City テーブルC ID NameID Tel Fax テーブルD ID NameID email CellPhone とします。 A.ID=1000の時各テーブルのレコード数が A:B:C:D=1:3:2:2となっています。 SQLの出力結果として A.ID A.Name A.Kana B.Count(ID) C.Count(ID) D.Count(ID) という、6項目を出力したいのですが 方法がわかりません。 試してみたのは select A.ID,A.Name,A.Kana,Count(B.ID),Count(C.ID),Count(D.ID) from A left join B on A.ID = B.NameID left join C on A.ID = C.NameID left join D on A.ID = D.NameID where A.ID = 1000 group by A.ID,A.Name,A.Kana ですが 結果、 A.ID = 1000 A.Name = Name A.Kana = Kana Count(B.ID) = 3 Count(C.ID) = 3 Count(D.ID) = 3 となってしまいます。 冷静に考えるとそうなんですが・・・ もしうまく結果を取得できる方法があればご教授いただきたく よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 複数行の結果を単一列に連結(複数のテーブルを参照)

    psql (PostgreSQL) 7.3.4です。 困っています 以下のような【TABLE1】と【TABLE2】を TABLE1のt1tot2にで結合した結果を 【A.結果】のように★▲●の行を1行に表示させて取得したいのですがうまくいきません。 【TABLE1】 ID,ID_SUB, TYPE, VALUE A A1 t1 1 ★ A A1 t2 2 ★ A A1 t1 1 ▲ A A1 t2 3 ▲ B B1 t1 1 ● B B1 t2 3 ● 【TABLE2】 ID, TYPEV1 ,TYPEV2 ,Code A 1 1 AAA1 A 1 2 AAA2 ★ A 1 3 AAA3 ▲ B 1 3 BBB1 ●  TYPEV1=TABLE1のt1の値 TYPEV2=TABLE1のt2の値 【得たい結果】 ID, ID_SUB, TYPEV1, TYPEV2,Code A A1 1 2 AAA2★ A A1 1 3 AAA2▲ B B1 1 3 BBB1● 下記でTABLE1の2行を1行にまとめることができましたが、 問題のTABLE2との連結方法が分かりません。 select TABLE1.ID , TABLE1.ID_SUB , TABLE1.VALUE as t1 , (SELECT tbl1.VALUE FROM TABLE1 tbl1 where tbl1.TYPE=t2 and (TABLE1.ID , TABLE1.ID_SUB)=(tbl1.ID , tbl1.ID_SUB)) as t2 from TABLE1 where TABLE1.TYPE = t1 【結果】 ID ,ID_SUB , t1  ,t2 A A1 1 2 ★ A A1 1 3 ▲ B B1 1 3 ● 何か良い方法はありますでしょうか?

  • 複数フィールドのカウント

    下記のようなテーブルで下記の結果を得られる SQL文を押していただけばと思います。 Micorosoft SQL Serverの予定です。 テーブル1 XX YY -------------------------- 商品a 商品d 商品b 商品a 商品c 得たい結果 商品a 2 商品b 1 商品c 1 商品d 1 UNIONでくっつけようと いろいろ考えて下記のようにしてみたいのですが SELECT XX,count(XX) FROM テーブル1 GROUP BY XX UNION SELECT YY,count(YY) FROM テーブル1 GROUP BY YY 下記の結果がえてしまい 商品a の結果を合計したです。 商品a 1 商品a 1 商品b 1 商品c 1 商品d 1 XX,YYを一括で集計(COUNT)できる方法やUNIONなどで別のフィールドにある同じ値を合計できる方法などもありましたらよろしくお願いします。

  • GROUP BY句の集計について

    はじめまして。 いろいろ調べて、何度試しても思うように 結果がでなかったので、投稿させて頂きました。 グループの集計をしてるのですが、 何個のグループがあるのかカウントしたいのです。 aaa bbb 110 a 110 b 111 c 112 d というDBに select aaa, bbb, count(*) as cnt from database GROUP BY aaa ORDER BY aaa だとそのグループ内の該当レコード数がカウントされてしまいます。 上記の例だとグループ数が“3”と結果を返すようにしたいのです。 では。宜しくお願いします。

    • ベストアンサー
    • MySQL
  • 複数テーブルの結合

    マスターテーブル1つと、子テーブルが複数存在して子テーブルにはマスターテーブルのidを格納するフィールドがあり参照しなくなったときにはそのidを消去するといったデータベースがあったときにマスターIDごとに子テーブルのどれか1つでも参照していればカウントするみたいなSQLをつくりたいんですが select count(m.id) from master m inner join a on m.id = a.m_id inner join b on m.id = b.m_id inner join c on m.id = c.m_id group by m.id みたいなSQLだとAにデータが存在しなければB以降に存在しても期待した結果が出力されません。A、B、Cいずれかのm_idとマスター側のIDが等しければカウントするという出力をするためにはどのように書けばいいんでしょうか。 わかりづらい説明で申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • access2010行カウント→テーブル更新

    access2010についてのご相談です。 現在表彰システムの作成を行っています。 1 対象者テーブル・・・識別ID(主キー),氏名,性別など・・・ 2 表彰カウントテーブル・・・識別ID,表彰年度,該当大会名,成績・・・・ 上記二つのテーブルがあり,識別IDで結合し,下記のクエリを作成しています。 1 個人表彰クエリ・・・識別ID,表彰年度,氏名,性別,該当大会名,成績・・・・ 上記クエリには過去の大会で優勝した記録が羅列される形となります。 ここで,過去の優勝回数が3回→特別賞,2回なら→敢闘賞などと集計し,その結果をレポートにしたいと考えております。ただし同一年度に2つの大会で優勝(2行ある)したとしてもそれは,1回の優勝としてカウントしたいです。 個人表彰クエリのうち,識別ID・表彰年度でグループ化された行数をカウントし,最終表彰種類として対象者テーブルにフィールドを追加して更新をかけたりすれば良いのかなと考えております。 が,どのように実現するのか分からず頭をかかえております。 アドバイスをいただければ幸いです。よろしくお願いいたします。