• 締切済み
  • すぐに回答を!

GROUP BY句の使用方法について(初歩的)

GROUP BY句の使用方法について質問させて下さい。 ■使用するテーブル  ID   日付 ----------------------  AAA   2007-04-01  AAA   2007-04-01  AAA   2007-04-02  AAA   2007-04-03  BBB   2007-04-01  BBB   2007-04-03  CCC   2007-04-02  CCC   2007-04-02  CCC   2007-04-02 ■抽出したいこと  ID毎のカウントを取りたいのですが、その際に同じ日付は1回のカウントとして抽出したいのです。  即ち、下記の結果を得るのが目的ですが、どのようなクエリとすればいいでしょうか?  ID  cnout(*) ----------------------  AAA   3  BBB   2  CCC   1 初歩的な質問なのですが、宜しくお願い致します。 (※環境はSQL-Server2000です)

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

みんなの回答

  • 回答No.3

SELECT ID, COUNT(ID) FROM テーブル GROUP BY 日付 日本語は下手ですから 特に説明がなかった

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

質問者からのお礼

お礼が遅れて申し訳ありません。 回答は大変参考とさせて頂きました。 どうもありがとうございます。

  • 回答No.2

SELECT ID, COUNT(DISTINCT 日付) FROM テーブル GROUP BY ID でいいと思いますけど。

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

質問者からのお礼

回答ありがとうございます! DISTINCTをそこに付けていいんですね!!! さっそく試してみます!!!

  • 回答No.1
  • pkh4989
  • ベストアンサー率62% (162/260)

お早うございます。 こんな感じでしょうか。 SELECT T1.ID, COUNT(T1.日付) FROM (  SELECT DISTINCT ID, 日付  FROM テーブル ) T1 GROUP BY T1.ID

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

質問者からのお礼

回答ありがとうございます。 やはりこのようなやり方となりますか。 例は簡単なものでしたが、実際には結構複雑なクエリとなってしまいなるべくスマートな方法をと思ったのですが。 試してみみます!

関連するQ&A

  • HAVING句でのBETWEEN演算子

    HAVING句でのBETWEEN演算子の使い方について教えていただけますでしょうか。 MS SQL SERVER のフロントエンドとしてMS ACCESS でパススルークエリを作成中です。 以下のようなテーブルがSQL SERVERにあります。 ID    TIME AAA   2005/06/01 00:00:10 BBB   2006/02/01 00:00:10 CCC   2006/03/01 00:00:10 AAA   2006/02/01 00:00:10 BBB   2006/02/02 00:00:10 CCC   2006/03/02 00:00:10 MS ACCESS パススルークエリで以下のようなSQL文を作成しました。 SQL文 SELECT ID, TIME FROM JOB WHERE TIME between '2006/01/01 00:00:00' and '2006/02/15 23:59:59' 結果 ID    TIME BBB   2006/02/01 00:00:10 AAA   2006/02/01 00:00:10 BBB   2006/02/02 00:00:10 抽出条件は TIME between '2006/01/01 00:00:00' and '2006/01/31 23:59:59' のままとし、IDをグルーピングしたいと思い以下のように書き換えましたが正しい記述では無いようでエラーとなってしまいます。 SELECT ID, TIME FROM JOB GROUP BY CODE HAVING TIME between '2006/01/01 00:00:00' and '2006/01/31 23:59:59' ORDER BY ID 欲しい結果 ID AAA BBB 正しい記述を教えていただけますでしょうか。 よろしくお願いいたします。

  • SQL抽出順番

    SQLの質問なんですが 以下のSQLがあるとします。 select カラムA、カラムC from test_table where in ('AAA','BBB','CCC'); ※条件はカラムAの値を使用しています。 結果が AAA 111 BBB 222 CCC 333 と出るとします。 下のように条件を変えたとき where in ('BBB','CCC','AAA'); BBB 222 CCC 333 AAA 111 と抽出と変わるようにしたいのですが、 (in句の左から順番にレコードが抽出したいです) 何か良い方法はありますでしょうか? rowid順で出力されてしまうのでしょうか? 以上です。 よろしくお願いします。

  • 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
  • 指定文字以降のソート方法

    以下のようなテーブル(てすと)があったとします。   (列)  AAA-2999 … (1)  BBB-4999 … (2)  CCC-3999 … (3)  DDD-1999 … (4) クエリ:SELECT 列 FROM てすと (ORDER BY ???) 結 果:(4)・(1)・(3)・(2) このテーブルを"-"以降で昇順にソートしたいのですが、ORDER BY句を用いてできるのでしょうか?

  • group by句

    以下のSQL文がoracle9iでOKで8iで通らないのですが、8iでも通るようになんとかできないでしょうか。 select a.val_Id, (select val_nm from tableA where val_id = a.val_id) as val_nm from tableA a group by a.val_id テーブルの内容 tableA( val_id number(1,0), val_code number(2,0), val_nm varchar(10) ) val_idとval_codeで一意となっています。 val_nmはval_idと一対一になっています。 要するにval_idに対応するval_nmも一緒に取得したいのですが、select句のサブクエリで8iの場合"group byの式ではありません"とおこられてしまいます。 ちなみに、今ここでは簡略化しているのですが本来は色なテーブルを結合しているので、単にgroup by val_id,val_nmとするのは無しでお願いいたします。 わかりにくいかとは思いますがお知恵をお貸しください。宜しくお願いいたします。

  • 「SELECT ~  FROM テーブル名」の後に続く句は「WHERE句」と「ORDER BY句」以外にありますか?

    最近アクセスのSQL文を学びました。 選択クエリのSQL文で 「SELECT ~  FROM テーブル名」 の後に続く句は 「WHERE句」と 「ORDER BY句」以外にありますか? よろしくお願いします。

  • 最新レコードを抽出し外部結合する方法について

    お世話になります。 現在、最新レコードを抽出し外部結合するSQLを考えているのですが、実現できておりません。 実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。 # 私の使用しているのは、PostgreSQL8.3となります。 実現したい内容は、以下となります。  1.テーブルAから「名前」でグループ化して最新の「更新日付」のレコードを抽出。  2.1の結果とテーブルBを「名前」で結合。  3.テーブルAの「名前」、「点数」、「更新日付」とテーブルBの「判定」を抽出。    ⇒ただしテーブルAに情報がある場合は、テーブルBの判定結果を「0」にして出力。      テーブルA               テーブルB ----------------------------   -----------------------  名前| 点数| 更新日付       名前 | 判定  ----------------------------   ----------------------- AAA   98   2011/4/1        AAA   0  AAA   60   2011/4/3        BBB   1  BBB   70   2011/4/2        CCC   1  BBB   35   2011/4/4        DDD   1  DDD   98   2011/4/1        EEE   0  EEE   47   2011/4/5         FFF   0  GGG   80   2011/4/6        GGG   1    【出力結果】 ---------------------------------------------  名前 | 点数  | 更新日付 | 判定  --------------------------------------------- AAA    60     2011/4/3      0  BBB    35     2011/4/4     0(1⇒0に変更)  CCC   NULL     NULL       1  DDD    98     2011/4/1     0(1⇒0に変更)  EEE    47     2011/4/5      0  FFF    NULL     NULL       0  GGG    80     2011/4/6     0(1⇒0に変更) お手数お掛け致しますが、ご教示のほどよろしくお願い致します。

  • group by句

    色々と試行錯誤してやっていますが、なかなか自分の 思うような結果が得られないためご質問させて下さい。 テーブルが全部で3つあります。 テーブルA id name 1 巨人 2   西武 テーブルB id name 1 小笠原 2 ラミレス 3 中島 4  片岡 テーブルC id テーブルAID テーブルBID 背番号 1 1 1 30 2 1 2 10 3 2 3 3 4 2 4 8 テーブルを結合し、テーブルCにある 背番号をテーブルAid,テーブルBidを元に sumしたいのですがうまくいきません。 以下がそのSQLになります。 (1)サブクエリーを使ったSQL この場合値が重複されて表示されてしまいます。 select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id group by c.テーブルAid ), (select sum(背番号) from tableC c where c.テーブルBid = bid group by c.テーブルBid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid (2) select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id ), (select sum(背番号) from tableC c where c.テーブルBid = bid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid group by c.テーブルAid 重複はされないのですが、group byが一つのみなので ちゃんとした出力がされません。    他にやり方があるのかもしれませんが、お分かりになる方が    いらっしゃいましたら、ご教授お願い致します。

  • 異なるキーで取得したデータの合成

    SQLに関して質問です。 以下のようなテーブルA、Bがあった場合、 【テーブルA】  カラム1  カラム2  ------------------------  AAA   CCC  BBB   DDD 【テーブルB】  カラム3  カラム4  ------------------------  AAA   1  BBB   2  CCC   3  DDD   4 次のような結果を得るにはどのようなSQL文を記述すれば良いでしょうか? 【求める結果】  カラム1  カラム2 カラム4(1) カラム4(2)  ---------------------------------------------------  AAA   CCC    1      3  BBB   DDD    2      4 非常に初歩的な質問かもしれませんが宜しくお願いいたします。

  • group byのSQLでインデックスを使いたい

    group byのSQLでインデックスは使えないものなのでしょうか. Using filesortにより,全レコードを読んでしまっています. どなたか解決法を教えてください. mysql> describe xxxxx; +--------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+----------------+ | aaa_id | bigint(20) | | PRI | NULL | auto_increment | | bbb_id | bigint(20) | | MUL | 0 | | | ccc_id | bigint(20) | | MUL | 0 | | +--------+--------------+------+-----+---------+----------------+ mysql> explain select ccc_id from xxxxx group by ccc_id =2; +----+-------------+-------+-------+---------------+--------+---------+------+------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+--------+---------+------+------+----------------------------------------------+ | 1 | SIMPLE | xxxxx | index | NULL | ccc_id | 8 | NULL | 628 | Using index; Using temporary; Using filesort | +----+-------------+-------+-------+---------------+--------+---------+------+------+----------------------------------------------+

    • ベストアンサー
    • MySQL