SQLで特定条件のデータを抽出する方法

このQ&Aのポイント
  • SQLを使用して、指定した日付範囲から3回以上、4回以下の重複データを抽出する方法を教えてください。
  • 現在、日付の範囲と3回以上の条件でデータを抽出することはできましたが、4回以下の条件の追加が上手くできません。
  • 以下のクエリを使用して、日付の範囲から3回以上のデータを抽出することができますが、4回以下の条件を追加する方法がわかりません。
回答を見る
  • ベストアンサー

SQL カウント 以上 以下

失礼します。現在ある日付の範囲から3回以上、4回以下(main_id)が重複しているデータを抽出したいのですが、日付の範囲と3回以上までは出来たのですが、 4回以下という条件の追加が上手くできません よろしければご教授お願い致します。 以下に指定日時範囲から3回以上まで作成した例を記載します。 SELECT * FROM old_テーブル名 where 日時 between '2017-08-01' and '2017-08-10' AND (main_id) in (SELECT main_id FROM テーブル名 GROUP BY main_id HAVING COUNT(*) >= 3); 3の後に AND COUNT(*) <= 4とやってのですが上手くいきませんでした

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

  • ベストアンサー
回答No.3

テーブルは1つですね。 では、まず、日付を指定したmain_id毎の件数を出してみて下さい。 SELECT main_id ,count(main_id) as count_main_id FROM テーブル名 where 日時 between '2017-08-01' and '2017-08-10' GROUP BY main_id ここまで、大丈夫なら、 件数で絞ってみましょう。 select main_id from ( SELECT main_id ,count(main_id) as count_main_id FROM テーブル名 where 日時 between '2017-08-01' and '2017-08-10' GROUP BY main_id ) tb1 where count_main_id between 3 and 4 ところで、 テーブル名のユニークキーは何ですか?

losloson
質問者

お礼

失礼しました。うまく作成できました。

その他の回答 (2)

回答No.2

SQL内に『old_テーブル名』と『テーブル名』という2つのテーブルが登場していますが、 これらの関係が明らかになっておらず、何かしたいのかがイマイチ分かりません。

losloson
質問者

お礼

間違えました日付範囲はうまくいっていますが、出現回数が上手くいかないです。

losloson
質問者

補足

失礼しました SELECT * FROM テーブル名 where 日時 between '2017-08-01' and '2017-08-10' AND (main_id) in (SELECT main_id FROM テーブル名 GROUP BY main_id HAVING (COUNT(main_id) >= 3 AND COUNT(main_id) <= 4)); このような形になりますが、そもそも日付範囲をしてから同じ値の出現回数をみていきたいのですが、日付範囲自体がまだうまくいっていないみたいです

  • chie65535
  • ベストアンサー率43% (8525/19380)
回答No.1

SELECT * FROM old_テーブル名 where 日時 between '2017-08-01' and '2017-08-10' AND (main_id) in (SELECT main_id FROM テーブル名 GROUP BY main_id HAVING (COUNT(main_id) >= 3 AND COUNT(main_id) <= 4)); ではどうでしょう?(テスト環境が無いので試していません)

losloson
質問者

お礼

失礼しました。そもそも上手くいっていたのは日付までで 回数の処理はうまくいってませんでした

losloson
質問者

補足

ご回答ありがとうございます。 うまくいかないみたいです、、、、、

関連するQ&A

  • 一定以上の行があれば最大値を持つ行を削除するSQL

    MySQL5にて、あるテーブルの特定フィールドの数(つまりcount値)が一定値以上であれば、間引きのため別のフィールドの値で最大値をもつ行を削除するSQLを考案中です。 イメージとしては以下の通りですが、SQLとしては誤っており、また、冗長です。 DELETE FROM table WHERE id={$id} AND (SELECT COUNT(*) FROM table WHERE id={$id}) > 5 AND begin = (SELECT MAX(begin) FROM table WHERE id={$id}); よい知恵をお授けください。

    • ベストアンサー
    • MySQL
  • 行のカウントを2種類を1つの文で発行したい

    こんにちは質問させてください。 商品が登録されているテーブル A に以下のカラムがあるとします。 id(int),  name(varcahr),  dt(datetime) id   には 店を識別す固有の番号がふってあり、 name には 商品名、  dt   には商品を登録した日付が入っているものとします。 やりたいことは ”id が 「1」 である全商品数” と ”今月登録された商品の数” を出力したいのです。 id が 1 である商品の数は以下のSQLで取り出せます。 SELECT COUNT(*) FROM  ( SELECT * FROM A WHERE A.id='1' ) AS tbl1 id が 1 で 今月登録された商品の数は以下のSQLで取り出せます。 SELECT COUNT(*) FROM  ( SELECT * FROM A     WHERE A.dt BETWEEN DATE(       DATE_SUB( NOW(), INTERVAL DAYOFMONTH( NOW() )-1 DAY) ) AND      LAST_DAY( NOW() ) AND A.id='1' ) AS tbl1 これをひとつのSQLにまとめるにはどうしたらいいのでしょうか…。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • in (サブクエリ) わかんない

    table hh; +------+ | id | +------+ | 1 | | 2 | | 3 | | 2 | | 1 | | 1 | +------+ select id,count(*) as cou from hh group by id having count(*) in (1,2,3); こいつはOK select id,count(*) as cou from hh group by id having count(*) in (select count(*) from hh group by id); こいつはダメ 違いはなんですか、教えて下さい

  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • アクセス 今日の日付の個数のみクエリで表示したい

    テーブル1に「日のみ」フィールドを作成し 日のみ 2009/06/28 2009/06/28 2009/06/27 としました。 新規に選択クエリを作成し SELECT Count(テーブル1.日のみ) AS 日のみのカウント FROM テーブル1 HAVING (((Count(テーブル1.日のみ)) Between Date() And Date()+1)); としたのですが、 0が返ってきます。 SELECT Count(テーブル1.日のみ) AS 日のみのカウント FROM テーブル1; だと3が返ってきます。 どうすれば今日の日付のみをカウントできるのでしょう? ご教授よろしくお願い致します。

  • データの件数を集計するための 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について

    AccessMDBで、以下のテーブルがあったとします。 テーブル1 ID,NAME 1,おなまえ 2,名前 3,なまえ テーブル2 ID,DB1_ID,NAME,開始日,終了日 1,1,4月,2006/4/1,2006/4/30 2,1,6月,2006/6/1,2006/6/30 3,2,2006年度,2006/4/1,2007/3/31 このとき、以下のように出力したいのですが ID(オートナンバーと仮定),NAME,月,開始日,終了日 1,おなまえ,4月,2006/4/1,2006/4/30 2,おなまえ,6月,2006/6/1,2006/6/30 3,おなまえ,(null),(null),(null) 4,名前,2006年度,2006/4/1,2007/3/31 5,名前,(null),(null),(null) 6,なまえ,(null),(null),(null) 試しにクェリーを作ってみた所、(null)の値を手入力しなければいけないのですが nullをいれさせるようにするには、どのようにしないといけないでしょうか? #テーブルをいじることはできず、SQLのみで対処することを考えています。 SELECT テーブル1.NAME, テーブル2.NAME, テーブル2.START, テーブル2.END FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.ID=テーブル2.DB1_ID UNION SELECT テーブル1.NAME, テーブル2.NAME,テーブル2.START,テーブル2.END FROM テーブル1; よろしくお願いします。

  • SQL文について困っています

    ID(NUMBER型)と NUM(NUMBER型)と nenngetu (date型)を持ったテーブルAAAから、 ID=1000 のなかで日時が一番古い処理NOをselectするSQL文を書きましたが上手く実行されません。 select NUM from AAA where nenngetu = (select min(nenngetu) from AAA) and ID=1000; ID=1000の条件をはぶき、 select NUM from AAA where nenngetu = (select min(nenngetu) from AAA); でしたら、実行できました。 oracleで実行しようとしています。 どなたか、書き方を教えてください。

  • 埋め込みSQLについて

    現在C言語で開発を行っている初級のIT技術者です。 pro*cでは、inner joinやexistsを使うとコンパイルエラーとなってしまいます。 泣く泣く、inを使ってしまいました。例えば以下テーブルがあります。 請求テーブル 識別ID 更新日付 201405 20140922 100177 20140204 258087 20140412 201497 20140711 258055 20140812 履歴テーブル 加入者ID 識別ID(主キー) 2014   201405 5800   587405 2014   258087  8507   874575 以下をパッケージに記載しています。 EXEC SQL SELECT 色々 FROM 請求テーブル WHERE 識別ID IN (SELECT 識別ID FROM 請求テーブル WHERE 加入者ID = 変数) ORDER BY 更新日付 ASC 例えば、変数として2014が来た場合は、履歴テーブルより 2014   201405 2014   258087 が選択されて、請求テーブルの更新日付を見て古い方を取ってくるので 結局258087 20140412が取得されます。この代わりとなる、pro*cで記述できる SQLはどんなのがありますでしょうか?

  • SQLで同じフィールドを2つ取りだしたい

    以下のテーブルからCSVを出力する際、 ID | 名称 | コード1 | コード2 1 |  A  |  111  |  444 2 |  B  |  222  |  555 3 |  C  |  333  |  666 「ID/名称/コード1コード2」のように取りだす場合のSQL文は SELECT ID, 名称, コード1 || コード1 FROM テーブル名 となると思いますがこれを、「ID/名称コード1/名称コード2」のように同じフィールドを同じ行に2回登場させたい場合はどうすれば宜しいでしょうか。 SELECT ID, 名称 || コード1, 名称 || コード2 FROM テーブル名 とした場合にはエラーになってしまいます。 宜しくお願い致します。