質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

5100閲覧

SQLで重複しているデータの件数をカウントしたい。

MM71

総合スコア0

COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/11/16 04:07

編集2021/11/16 04:18

解決したいこと

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

テーブル:商品

商品番号登録日時区分
A0012021/03/022
A0012019/06/063
A0012020/05/064
### 使用したSQL
SELECT 商品番号, COUNT(商品番号) FROM 商品 X WHERE EXISTS ( SELECT * FROM 商品 Y WHERE X.商品番号 = Y.商品番号 GROUP BY Y.商品番号 HAVING COUNT(Y.商品番号) > 1 ) GROUP BY 商品番号

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

商品番号登録日時区分
A0012021/03/022
A0012019/06/063
A0012020/05/064

結果

商品番号COUNT(商品番号)
A0013

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

商品番号登録日時区分
A0012022/03/022
A0012023/06/063
A0012025/05/064

結果

商品番号COUNT(商品番号)
A0013

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

商品番号登録日時区分
A0012023/03/022
A0012019/06/063
A0012025/05/064

結果

商品番号COUNT(商品番号)
A0012

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

商品番号登録日時区分
A0012023/03/022
A001NULL3
A0012018/05/064

結果

商品番号COUNT(商品番号)
A0012

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

商品番号登録日時区分
A001NULL1
A001NULL2
A001NULL3

結果

商品番号COUNT(商品番号)
A0012

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

使用したSQL

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2021/11/16 05:50 編集

未来日とか過去日というのは何を基準にしたものですか? また、重複データを前提にしているのに商品番号がNullとはどういう状態ですか? (商品番号がNullのものも重複のパターンとするという事ですか?) ↑見直すと、Nullというのは登録日時の事ですね。 それを前提に見直すと、 > ④重複データの登録日時が未来日 かつ NULLを持つ というのは未来日のデータがあり、且つ、登録日時がNullのものもあるという状態でしょうか?
MM71

2021/11/16 05:55

>未来日とか過去日というのは何を基準にしたものですか? 記載漏れしてました。SYSDATEを基準としています。 > ④重複データの登録日時が未来日 かつ NULLを持つ というのは未来日のデータがあり、且つ、登録日時がNullのものもあるという状態でしょうか? はい。その状態ということで合っております。
guest

回答1

0

①登録日時が全て過去日を持つ商品番号と、そのぶら下がってる件数。
②登録日時が全て未来日を持つ商品番号と、そのぶら下がっている件数。
③登録日時が未来日が複数(2<=)ある かつ NULLを含まない商品番号と、そのぶら下がっている件数。※未来日のみカウント。
④登録日時が未来日 かつ NULLを持つ商品番号と、そのぶら下がっている件数。※未来日とNULLのみカウント。
⑤登録日時が全てNULLを持つ商品番号と、そのぶら下がっている件数。

上記条件の件数をそれぞれ求めて、その内の重複データのものという条件にしています。
※検証はしていませんので、あくまでイメージとして考えて下さい。

SQL

1SELECT 商品番号 2 , sum(case when not exists(select 1 from 商品 where 商品番号=x.商品番号 and (登録日時 > sysdate or 登録日時 is null) then 1 else 0 end) as3 , sum(case when not exists(select 1 from 商品 where 商品番号=x.商品番号 and (登録日時 < sysdate or 登録日時 is null) then 1 else 0 end) as4 , sum(case when 登録日時 > sysdate 5 and (select count(*) from 商品 where 商品番号=x.商品番号 and 登録日時 > sysdate) > 1 6 and not exists(select 1 from 商品 where 商品番号=x.商品番号 and 登録日時 is null) 7 then 1 else 0 end) as8 , sum(case when (登録日時 > sysdate or 登録日時 is null) 9 and exists(select 1 from 商品 where 商品番号=x.商品番号 and 登録日時 > sysdate) 10 and exists(select 1 from 商品 where 商品番号=x.商品番号 and 登録日時 is null) 11 then 1 else 0 end) as12 , sum(case when not exists(select 1 from 商品 where 商品番号=x.商品番号 and 登録日時 is not null) then 1 else 0 end) as13FROM 商品 x 14GROUP BY 商品番号 15HAVING COUNT(商品番号) > 1 16

投稿2021/11/16 06:46

編集2021/11/16 06:52
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問