@mura70001

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

SQLで重複データの件数を算出したい

解決したいこと

重複した列[商品番号]がある場合、その件数を下記SQLで算出しました。

テーブル:商品

商品番号 登録日時 区分
A001 2021/03/02 2
A001 2019/06/06 3
A001 2020/05/06 4

使用したSQL

SELECT
  商品番号,
  COUNT(商品番号) 
FROM
  商品 X
WHERE
  EXISTS ( 
    SELECT
      *
    FROM
      商品 Y 
    WHERE
      X.商品番号 = Y.商品番号
    GROUP BY
      Y.商品番号
    HAVING
      COUNT(Y.商品番号) > 1
  ) 
GROUP BY 商品番号

そこで、算出する条件を列[区分]が 1 であるデータを除く と設定し、
更に下記パターン別で条件を加えたうえでそれぞれ件数を算出したいです。
条件:
①重複データの登録日時が全て過去日を持つ商品番号と、そのぶら下がってる件数。
例)

商品番号 登録日時 区分
A001 2021/03/02 2
A001 2019/06/06 3
A001 2020/05/06 4

結果

商品番号 COUNT(商品番号)
A001 3

②重複データの登録日時が全て未来日を持つ商品番号と、そのぶら下がっている件数。
例)

商品番号 登録日時 区分
A001 2022/03/02 2
A001 2023/06/06 3
A001 2025/05/06 4

結果

商品番号 COUNT(商品番号)
A001 3

③重複データの登録日時が未来日が複数(2<=)ある かつ NULLを含まない商品番号と、
  そのぶら下がっている件数。※未来日のみカウント。
例)

商品番号 登録日時 区分
A001 2023/03/02 2
A001 2019/06/06 3
A001 2025/05/06 4

結果

商品番号 COUNT(商品番号)
A001 2

④重複データの登録日時が未来日 かつ NULLを持つ商品番号と、そのぶら下がっている件数。
※未来日とNULLのみカウント。
例)

商品番号 登録日時 区分
A001 2023/03/02 2
A001 NULL 3
A001 2018/05/06 4

結果

商品番号 COUNT(商品番号)
A001 2

⑤重複データの登録日時が全てNULLを持つ商品番号と、そのぶら下がっている件数。
例)

商品番号 登録日時 区分
A001 NULL 1
A001 NULL 2
A001 NULL 3

結果

商品番号 COUNT(商品番号)
A001 2

列[区分]が 1 であるデータを除く条件+上記5パターンの条件で件数を出す場合、
EXISTSの中のWHEREにその条件を入れるのか、それともEXISTSの外に入れるのが適切なのかをお聞きしたいのが1点と、
パターン別の条件の後ろに※でカウントする際の条件を記載しており、その条件に関してもEXISTの中か外どちらが適切かという点についても教えていただきたく思います。
また、その際、一例としてSQLに書き加えてご提示して頂けると助かります。

0 likes

2Answer

そもそもEXISTS使う必要がないような...

DB_Fiddle_-_SQL_Database_Playground-2.png

select item, count(item) from test where type_id > 1 AND registered_on < CURRENT_DATE group by item;
select item, count(item) from test where type_id > 1 AND registered_on > CURRENT_DATE group by item;
select item, count(item) from test where type_id > 1 AND (registered_on > CURRENT_DATE OR registered_on IS null) group by item;

/* もしくはこう? */
select * from (select item, count(item) as item_count from test where type_id > 1 AND (registered_on > CURRENT_DATE OR registered_on IS null) group by item
) as temp
where item_count > 1;
select item, count(item) from test where type_id > 1 AND registered_on IS null group by item;
1Like

Comments

  1. @mura70001

    Questioner

    回答して頂きありがとうございます。EXISTSでなくても算出可能でした。。
    EXISTを使用しないSQLを組んでみたいと思います。とても参考になりました。ありがとうございます。

質問の意図とは違うかもしれませんが、
可能であれば、元のSQLを簡単にした方が良いかもしれません

重複した商品番号とその件数を取得するSQL
SELECT
  商品番号,
  COUNT(商品番号)
FROM 商品
GROUP BY 商品番号
HAVING
COUNT(商品番号) > 1
1Like

Comments

  1. @mura70001

    Questioner

    難しく考えすぎていました。。このように組めば簡単に算出できそうです!回答して頂き、ありがとうございます。

Your answer might help someone💌