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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

Q&A

解決済

3回答

841閲覧

同一テーブルの結果が異なる行数をカウントしたい。

menmnemnapte

総合スコア1

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

1グッド

0クリップ

投稿2023/06/12 00:02

編集2023/06/12 02:31

実現したいこと

下記のような、同一テーブル内の結果の値が異なる行を数えたいです。
テーブルの中は、本来はもっと多くのデータがありますが必要な部分だけ抜粋してみました。

抽出し、数えたいのは下記のような形です。
商品列(syohin)
フラグ列flg(1~4)の中で0と1またはnull値が混じるデータがあるとします。
この表で、フラグの値が異なる"行"の数だけカウントしたいです。
(フラグの値が1だけでも、0だけでもない。 0と1とnullが混在する行)
■追記 nullの扱いについて。
全ての値がnullという行は存在しないと思いますが、
もし存在している場合は1でも0でもない、異なる行という扱いを取りたい。

下の表で行くと、結果はcount(syohin) 4
という結果となるのが理想です。

-----zaikoテーブル-----

syohin/flg1/flg2/flg3/flg4
aaa/1/0/1/0
bbb/1/1/1/1
ccc/1/1/0/0
dde/0/0/1/0
eee/1/1/1/1
fff/0/0/0/0
ggg/1/null/0/0

試したこと

そもそもこのやり方があっているのかどうかわかりませんが、
カウントする前に一度表に出してみることとしました。

select syohin ,flg1 ,flg2 ,flg3 ,flg4 from syohin Where flg1 +flg2 +flg3 +flg4 >= 1 and flg1 +flg2 +flg3 +flg4 < 4;

こちらを実行すると
-----zaikoテーブル-----
syohin/flg1/flg2/flg3/flg4
aaa/1/0/1/0
ccc/1/1/0/0
dde/0/0/1/0

flg1~4の値を横に足し算し、足し算の結果が1以上4未満となった
行は取り出せたように見えました。
ただ1つ問題があり、nullがあるデータが取り出せませんでした。

②対象列のカウント
上の表の条件は変えずにzaiko列を数えます。

select count(syohin) from syohin Where flg1 +flg2 +flg3 +flg4 >= 1 and flg1 +flg2 +flg3 +flg4 < 4;

結果:count(syohin)3

まとめると、
・nullがある行も対象にしたいのですが、どうしたらnullも含まれるようになるのでしょうか。
・上の書き方はかなり冗長的で改善の余地があると思いますが
他にどのような抽出方法がありますでしょうか。

ご教示の程よろしくお願い致します。

再追記)
数えたい対象が列と行反対でしたので掲載し直しました。
回答してくださった方申し訳ございません。

takanaweb5👍を押しています

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

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

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

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

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

XiiTuzi

2023/06/12 00:24

nullの扱いはどのようにすればよいですか? 0か1か、どちらでもないか。 oracleであればnvlを使うという手段もあります。
menmnemnapte

2023/06/12 00:48

ありがとうございます。 nullは0でも1でもない扱いとします。 また、全ての値がnullという行は存在しないと思いますが もしそのような行存在している場合は1でも0でもない、異なる行という扱いを取りたいです。
guest

回答3

0

ベストアンサー

sql

1select * 2 from syohin 3 where nvl(flg1 + flg2 + flg3 + flg4, -1) in (-1,1,2,3);

参考
https://dbfiddle.uk/jDMVIA8n

投稿2023/06/12 13:28

takanaweb5

総合スコア359

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

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

menmnemnapte

2023/06/13 06:27 編集

takanaweb5様 非常に理解し易いSQLでありがたいです。 実行してから自身の勘違いに気付いたのですが、 フラグの結果にnull,0,1が含まれるものをカウント null,0,1のみは除外したいの間違えでした。
takanaweb5

2023/06/13 12:49 編集

select * from syohin where nvl(flg1 + flg2 + flg3 + flg4, -1) in (-1,1,2,3) and COALESCE(flg1, flg2, flg3, flg4) is not null; 2023.6.13 21:50 修正 こっちの方が分かり易いかもしれません select * from syohin where nvl(flg1 + flg2 + flg3 + flg4, -1) in (-1,1,2,3) and COALESCE(flg1, flg2, flg3, flg4, -1) <> -1;
takanaweb5

2023/06/13 07:08

select * from syohin where (nvl(flg1,-1), nvl(flg2,-1), nvl(flg3,-1), nvl(flg4,-1)) not in ((-1,-1,-1,-1),(0,0,0,0),(1,1,1,1))
takanaweb5

2023/06/14 12:23

質問者さんが期待する条件は、上記の条件ではなく いずれかのflgが1 かつ いずれかのflgが0 ということでしょうか? select * from syohin where 1 in(flg1 , flg2 , flg3 , flg4) and 0 in(flg1 , flg2 , flg3 , flg4)
menmnemnapte

2023/06/15 00:27

6/13に記載していただい方法で希望の行を抽出することができましたので解決しました。 非常にシンプルなSQLで大変に助かりました。 ありがとうございました。
guest

0

sql

1select 2 hoge, 3 count(*) 4 from 5 ( 6 select 7 *, 8 COALESCE(flg1, '-') || 9 COALESCE(flg2, '-') || 10 COALESCE(flg3, '-') || 11 COALESCE(flg4, '-') as hoge 12 from 13 zaiko 14 where 15 hoge not in ( 16 '----', '0000', '1111' 17 ) 18 ) as xx 19 group by hoge 20;

投稿2023/06/12 00:30

編集2023/06/12 01:01
shiketa

総合スコア4114

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

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

XiiTuzi

2023/06/12 01:56

質問のSQLを見ると足し算しているので、多分フラグは数値型だと思いますよ。 暗黙の型変換は好みではありません。
menmnemnapte

2023/06/13 06:15

仰る通りフラグのデータはint型ですが、このような書き方もあるのですね。 参考になります。
guest

0

SQL

1select count(*) from ( 2select syohin from 3( 4select syohin,flg1 as flg from syohin 5union select syohin,flg2 from syohin 6union select syohin,flg3 from syohin 7union select syohin,flg4 from syohin 8) as t1 9group by syohin 10having count(*)>1 11) as t2

投稿2023/06/12 01:40

yambejp

総合スコア117674

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

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

XiiTuzi

2023/06/13 00:20

zaikoテーブルでは? また、oracleなのでサブクエリ後の as は不要です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問