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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

Q&A

3回答

313閲覧

【SQL】同一のカラムの値で・・・②

AT_WORK24

総合スコア9

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

0グッド

1クリップ

投稿2017/10/30 02:13

編集2022/01/12 10:55

下記の条件でのSQLをなるべくデータベースに掛かるコストが軽くなるように
作成したいのですが、なかなかいい案が思いつきません。

【条件】
抽出結果としては、
下記の条件に当てはまる項目Aを出力しようと考えております。

①項目Aの値が同一である
②項目Bの値が'赤'になっているレコードが含まれている
③項目Bの値が'青'になっているレコードが含まれていない
④項目Bの値が'黄'になっているレコードが含まれていない
⑤項目Bの値が'赤'になっているレコードのみしか存在せず、2件以上の場合は抽出しない

(例)
項目A 項目B
100 赤
100 青
100 黄
200 赤
200 赤
300 赤
400 赤
400 青
400 黄
500 赤
500 赤
600 赤
600 青

上記の例の場合には、
300が結果として抽出したいということです。

有識者の方々、ご指南いただけると幸いです。

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

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

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

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

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

ttyp03

2017/10/30 02:31

600は青が含まれているから対象外ではないのですか?
nitoage

2017/10/30 02:33

ご記載いただいている条件で、300と600が抽出される理由がわからないです。すべての条件がandで達成される場合だと300のみが結果な気がしますが。。。あってますでしょうか?
AT_WORK24

2017/10/30 02:36

すみません!回答が誤っていたため、更新しました。ご指摘通り、300のみが抽出されます。
yambejp

2017/10/30 02:37

600は青を含んでいますが?
SVC34

2017/10/30 04:59

「①項目Aの値が同一である」とは具体的に何と同一であることを確認するのでしょうか
sazi

2017/10/30 06:58 編集

前回の質問は解決でしたけど、結局コストというところで解決していないのではないですか?コストが最優先なら名称は兎も角、構造やインデックス、実行計画などの状況などを提示された方が良いですよ。
guest

回答3

0

SQLServerの分析関数の使用例
https://oraclesqlpuzzle.ninja-web.net/sqlserver2008-sql1-olap.html
の「7. 全称肯定,全称否定,存在肯定,存在否定」を見ながら
SQLFiddleのSQLServer2014環境で作ってみました :-)

sql

1with t(項目A,項目B) as( 2select 100,N'赤' union all 3select 100,N'青' union all 4select 100,N'黄' union all 5select 200,N'赤' union all 6select 200,N'赤' union all 7select 300,N'赤' union all 8select 400,N'赤' union all 9select 400,N'青' union all 10select 400,N'黄' union all 11select 500,N'赤' union all 12select 500,N'赤' union all 13select 600,N'赤' union all 14select 600,N'青' union all 15select 700,N'赤' union all 16select 700,N'緑' union all 17select 700,N'黒' union all 18select 800,N'赤' union all 19select 800,N'赤' union all 20select 800,N'黒') 21select 項目A 22 from t 23group by 項目A 24having sum(case 項目B when N'赤' then 1 else 0 end) > 0 --条件2 25 and sum(case 項目B when N'青' then 1 else 0 end) = 0 --条件3 26 and sum(case 項目B when N'黄' then 1 else 0 end) = 0 --条件4 27 and not (min(case 項目B when N'赤' then 1 else 0 end) = 1 --条件5 28 and count(*) >= 2) 29order by 項目A 30 31| 項目A | 32|-----| 33| 300 | 34| 700 | 35| 800 |

投稿2017/10/31 06:22

編集2019/03/12 06:35
AketiJyuuzou

総合スコア1147

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

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

0

300だけでいいならコウです

SQL

1 2select 項目A from tbl 3group by 項目A 4having sum(case 項目B when '赤' then 1 else 2 end)=1 5

追記

実は赤・青・黄以外にも色がありその色が指定されたデータ数は不問で、
青・黄だけ除いた上で赤が1つだけのデータをほしいならこうです

SQL

1select 項目A from tbl 2group by 項目A 3having sum(case 項目B when '赤' then 1 when '青' then 2 when '黄' then 2 else 0 end)=1

投稿2017/10/30 02:42

編集2017/10/31 03:54
yambejp

総合スコア114585

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

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

0

動作確認できてませんが、こんな感じでしょうか。

SQL

1select 項目A, 2 sum(case when 項目B='赤' then 1 else 0 end) as rcnt, 3 sum(case when 項目B='青' then 1 else 0 end) as bcnt, 4 sum(case when 項目B='黄' then 1 else 0 end) as ycnt 5from tbl 6group by 項目A 7having rcnt=1 and bcnt=0 and ycnt=0;

投稿2017/10/30 02:43

ttyp03

総合スコア16996

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

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

AT_WORK24

2017/10/30 05:43

仮に赤、青、黄のほかに別色が存在した場合に、赤を2件以上含んでいて別色が含まれているものは抽出したい場合は(赤のみで2件以上のみを除きたい)、上記のクエリだと難しいですよね?
ttyp03

2017/10/30 05:48

そうですね。 他の色の可能性も含めるのであれば、赤と赤以外の件数を数えればよいかと思います。 select 項目A, sum(case when 項目B='赤' then 1 else 0 end) as rcnt, sum(case when 項目B<>'赤' then 1 else 0 end) as nrcnt from tbl group by 項目A having rcnt=1 and nrcnt=0;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問