アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもこちらの掲示板にはお世話になっております。

SQLの構文に関する質問です。
group by にて”生徒”、”好み”に分類し、下記のような結果が出ました。
(生徒、好み共にダミー変数に変換済)
生徒番号は1~2000ですが、抜けもあります。
好みは1~3の3つです(好みは複数回答可)。
生徒は1~3のいずれかに必ず回答しています。

生徒  好み
1   1
2   1
3   1
3   2
4   1
4   2
4   3
5   1
5   2
6   3
7 1
7 3
8 2
8 3
以下、生徒番号2000まで続く

この結果から、
1 「1」のみを選んでいる生徒
2 「2」、または「3」を選んでいる生徒(2と3の2つを選ぶことも含みます)
の生徒番号を抽出したいと考えています。
(上記2つの結果(1を選んでいるのか、2または3を選んでいるのか)も含みます)

つまり、「1」を選びつつ、「2」または「3」をさらに選んでいる生徒は除外し、
生徒がどちらを選んだのかを抽出したいです。

この場合、どのような構文が適切なのか、調べましたがまったくわからなかったので、
詳しい方がいらっしゃいましたらご教授お願いします。

A 回答 (3件)

SELECT A.生徒番号, CASE MIN(A.好み) WHEN 1 THEN 1 ELSE 2 END AS 好み FROM テーブル A


GROUP BY A.生徒番号
HAVING MAX(A.好み) = 1 OR MIN(A.好み) > 1

でいかがでしょう。
    • good
    • 0
この回答へのお礼

できました、ありがとうございます。
まったく知らなかったスクリプトなので助かりました(*'▽')

お礼日時:2018/09/01 20:14

複数選択可能ならば


下記ようにフィルド構成を変えて抽出する方が単純じゃないでしょうか?
テーブル
フィルド 
生徒番号 int
好み1   true/false
好み2   true/false
好み3  true/false

元テーブルから上記テーブルを作成し、クエリかければどうかと
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2018/09/01 20:15

前提として「生徒、好み」の組み合わせがユニークであるという条件が必要


その上で1のみを選んでいる人
SELECT 生徒
FROM テーブル
GROUP BY 生徒
HAVING SUM(CASE 好み WHEN 1 THEN 1 ELSE 2 END) = 1

「2」、または「3」を選んでいる生徒
SELECT 生徒
FROM テーブル
GROUP BY 生徒
HAVING SUM(CASE 好み WHEN 2 THEN 1 WHEN 3 THEN 1 ELSE 0 END) > 0

> 「1」を選びつつ、「2」または「3」をさらに選んでいる生徒は除外し、
生徒がどちらを選んだのかを抽出したいです。

ちょっと意味不明。
もう少しわかりやすく例示のサンプルで具体的な番号を含めて提示してください
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2018/09/01 20:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!