• ベストアンサー

SQLの質問

初歩的な質問ですみません。 テーブル foo に以下のような一列があったとします。 colA -- a a a a b b c c c この中からcolAでグループ化したcountが最大のものを抽出するSQLっどう書けばよいのでしょうか (この例では a がセレクトされる結果をなります)。 できる限り一般的な方法でお願いします。

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

  • ベストアンサー
  • takopon
  • ベストアンサー率69% (27/39)
回答No.1

別名と副問い合わせを使うと出来ます。 まず、グループ化してカウントをとるSQLを書きます。 カウントには別名をつけます。 select colA,count(*) CNT from foo group by colA これを、以下のようにfromの副問い合わせにすることができます。 select MAX(CNT) from  ( select colA,count(*) CNT   from foo   group by colA  ) これをさらに、havingの副問い合わせに入れてあげるとできあがりです。 select colA,count(*) from foo group by colA having count(*) = (select MAX(CNT)            from            ( select colA,count(*) CNT             from foo foo2             group by colA            )           )

snuffy
質問者

お礼

なるほどー。簡単なようで以外と手順踏むんですね。勉強になりました!

関連するQ&A

  • SQLでの抽出条件

    SQL初心者です。初歩的な質問だと思いますが、ご教授願います。 以下のような2つのテーブルがあります。 【テーブルA】 グループ 社員番号 A 1 A 2 A 3 B 4 B 5 B 6 C 7 C 8 D 9 D 1 【テーブルB】 社員番号 1 9 テーブルBの社員番号と一致する場合、テーブルAをグループ単位で抽出しないようにしたいです。  ・グループAは社員番号1が一致するため抽出しない。  ・グループDは社員番号1と9が一致するため抽出しない。 【取得結果】 グループ 社員番号 B 4 B 5 B 6 C 7 C 8 説明が分かりづらくて申し訳ありませんが、よろしくお願い致します。

  • SQL の抽出方法

    あるテーブルABC に項目aとbとc があるとします。 今、抽出の条件が 仮にa=1,b=2 として、 この条件で複数件のデータが抽出され その中からcが最大のデータ1件のみを抽出するとします。 このSQLを作成する場合、 どのような方法がありますでしょうか? select文で、1度cのmax値を求めないといけないでしょうか?

  • SQLの書き方(チェックボックス)

    このスレでいいのかちょとわからなかったのですが、 SQLの書き方のなのでこちらで質問をさせて頂きます。 (VB.NET) □ A □ B □ C チェックボックス(A,B,C)があります。 例えば(A、B,C)どれか一つ選択された場合 SELECT文でテーブルA、B、Cからデータを抽出するイメージは わくのですが、チェックボックスで(A、C)など複数 選択された場合には、SELECT文でテーブルAを抽出し 終わった後、SELECT文でテーブルCを抽出するのは 問題があるのではないかと思います。 ただイメージがわきません…。ヒントでもいいので もしよろしければアドバイスよろしくお願い致します。

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

  • 重複するレコードを調べるSQL

    重複するレコードを調べるSQL 初歩的な質問ですみません! 重複するレコードを調べるために以下のようなSQLを作ったのですが、 遅くて困っています。 もっと速くする方法があれば教えてください! 異なるカテゴリーでも商品コードが重複しているものがないかを探すSQLです。 SELECT A.商品コード, A.X, B.カテゴリー FROM (SELECT COUNT(商品コード) X, 商品コード FROM テーブルA WHERE 追加年月 = 201008 GROUP BY 商品コード) A, (SELECT 商品コード, カテゴリー FROM テーブルA WHERE 追加年月 = 201008 ) B " WHERE A.X >= 2 AND B.商品コード = A.商品コード

  • SQLにて順列の抽出

    MySQLにてSELECT文にて順列の抽出をしようと試みていますが、順列を出すためのSQL文がわからず困っています。 TABLE1 +-----+-----+-----+-----+ | NUM | A | B | C | +-----+-----+-----+-----+ | 101 | 0 | 4 | 9 | +-----+-----+-----+-----+ | 102 | 2 | 2 | 0 | +-----+-----+-----+-----+ 例えば上記の様なテーブルがあって、NUM=101のA,B,Cを取り出して 049 094 409 490 904 940 のような順列を作り出してPHPから渡した変数D(仮にvar=409)と照らし合わせようと試みていますが、1つの行の中の数字で順列を抽出するSQL文がわからず困っていますので、ご教授願います。

    • ベストアンサー
    • MySQL
  • 最大バイト数を調べるSQL文を教えてください

    SQL初心者です。 初歩的なSelect文だと思うのですが、 以下のSQLの書き方を教えてください。 「テーブルAの列Bに入っている文字列のバイト数のうち、  最大のバイト数の値を返すSQL」 バイト数をすべて取得するのであれば SELECT LENGTHB(B) FROM A になるかと思うのですが、最大のものを 求める書き方がわかりません。 よろしくお願いします。

  • 抽出した行数を変数に入れたい(オラクルSQL)

    SELECTで抽出した行数を変数に格納したいのですが、上手くいきません。 SQLにあまり経験がなく、ネットで調べながら実践しております。 例えば以下の簡単なSQLを作ったとして、 ---------------------------------------------------- SELECT a,b,c,d,e,f FROM table WHERE c=10 AND e=20; ---------------------------------------------------- ここで抽出した行数を取得し、それを変数に入れたいと思っております。 というのも、後々、抽出したデータの行数を表示したい場合に SELECT COUNT(*) FROM table WHERE c=10 AND e=20; というSQLをその都度入力していては非効率だと思ったからです。 そこで抽出する際に行数を取得し、それを変数に格納して、 行数を表示する処理が今後必要になった際に、その変数を表示すれば良いと考えました。 ですがネットで変数のことを調べた際に VARやDEFINE等のコマンドを見つけましたが、SQLを実行しても上手くいきません。 最初に記載したSQLに、どのような構文を入れたら良いのでしょうか。

  • データの件数を集計するための SQL

    データの件数を集計するための SQL について教えてください。 例えば以下のようなテーブルがあります。 ▼テーブル 名前 |交通手段|日付 -----+--------+---- Aさん|バス |5/1 Aさん|バス |5/2 Aさん|バス |5/3 Bさん|バス |5/1 Bさん|電車 |5/2 ※「日付」については、本質問に直接の関係はありません。 このテーブルにクエリを発行して、以下の結果を取得したいと考えています。 ▼取得したい結果 名前 |交通手段|回数 -----+--------+---- Aさん|バス |3 Bさん|バス |1 Bさん|電車 |1 当方がイメージしている流れは以下の通りです。 SQL は苦手でして、これをひとつにまとめることができません。 1) GROUP BY で束ねる SELECT 名前, 交通手段 FROM テーブル GROUP BY 名前, 交通手段 2) 1)の結果の1件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Aさん' AND 交通手段='バス' 3) 1)の結果の2件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='バス' 4) 1)の結果の3件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='電車' なおレンタルサーバ上 (MySQL 5.0.77) で稼働させるため、 なるべく高速な SQL を希望いたします。

    • ベストアンサー
    • MySQL
  • SQLの書き方

    select A.NO, A.NAME, count(B.TEN) FROM T1 A, T2 B GROUP BY A.NO ORDER BY 3 DESC 結果として以下のようになってほしいのですが、どのようにSQLを書けばよいのでしょうか? 結果 NO | NAME | TEN ---+------+----- 3 + 上村 + 40 1 + 吉田 + 11 2 + 浅野 + 6 T1テーブル NO | NAME ---+-------- 1 + 吉田 2 + 浅野 3 + 上村 T2テーブル NO | TEN ---+-------- 1 + 10 2 + 5 3 + 0 1 + 1 2 + 1 3 + 40