こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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とやってのですが上手くいきませんでした

投稿日時 - 2017-10-04 13:32:55

QNo.9382077

困ってます

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

テーブルは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


ところで、
テーブル名のユニークキーは何ですか?

投稿日時 - 2017-10-04 17:53:23

お礼

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

投稿日時 - 2017-10-05 10:22:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

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

投稿日時 - 2017-10-04 15:57:22

補足

失礼しました
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));

このような形になりますが、そもそも日付範囲をしてから同じ値の出現回数をみていきたいのですが、日付範囲自体がまだうまくいっていないみたいです

投稿日時 - 2017-10-04 16:25:38

お礼

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

投稿日時 - 2017-10-04 16:34:23

ANo.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));

ではどうでしょう?(テスト環境が無いので試していません)

投稿日時 - 2017-10-04 14:02:12

補足

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

投稿日時 - 2017-10-04 14:09:27

お礼

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

投稿日時 - 2017-10-04 14:51:20

あなたにオススメの質問