skillup

技術ブログ

Database

CASE+HAVING句

投稿日:

今回はCASEとHAVINGを組み合わせて、そこそこの難問を解いていきます。

まず下記のようなテーブル(testresults)があるとします。

student | class | sex | score
————–+——-+—–+——-
001 | A | 男 | 100
002 | A | 女 | 100
003 | A | 女 | 49
004 | A | 男 | 30
005 | B | 女 | 100
006 | B | 男 | 92
007 | B | 男 | 80
008 | B | 男 | 80
009 | B | 女 | 10
010 | C | 男 | 92
011 | C | 男 | 80
012 | C | 女 | 21
013 | D | 女 | 100
014 | D | 女 | 0
015 | D | 女 | 0

下記3題をCASEフラグとHAVINGで求めていきます。

コツとしては下記のようなことがあげられます。

  • 特定条件のの生徒をCASEで条件分岐させてフラグを立てる
  • さらにそれのSUMをとり、全体数と比較し、HAVINGで合致しているものを出力
  • SQLは割り算が整数になってしまうなどに注意。

なお下記SQLではSELECTの列で計算式をかいていますが、ここは書かなくてもOKです。(私が途中計算するうえでの確かめのために出してます。)

問題1
クラスの75%以上が80点以上のクラスを求めよ

答えはクラスBですが、

問題2
50点以上を取った生徒のうち、男子の数が女子の数よりも多いクラスを求めよ

クラスBとクラスCが該当。

第3問

女子の平均点が、男子の平均点より高いクラスを選択せよ。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

SQLインジェクション

セキュリティ関係の知識がぬるいのでちょっとお勉強。 知っていることもあるが復習もかねて勉強を。 Contents1 SQLインジェクションとは?2 被害3 対策4 参考サイト・書籍5 ソース SQLイ …

no image

MySQLでのlocalhostと127.0.0.1の違い

たまにMySQLでローカルのホストに接続する時に、localhostで接続するときと127.0.0.1で接続するときで挙動が違う(片方だとエラーになり、もう片方だとエラーにならない)などがあるのでちょ …

no image

アンチパターン バインド変数の未使用+直積組み合わせ+データ量爆発+インデックス関連

本日はSQLコーディングに関して。 ここら辺は実際にプログラムを書く際に重要になってくるネタ。 Contents1 バインド変数1.1 デメリット1.2 対策2 直積により組み合わせが爆発する2.1 …

no image

MySQLの大文字、小文字問題について

MySQLでテーブルを作る際にカラムに重複を許さない制約(unique)を振ることがあると思います。 数字の場合は問題ないのですが、文字列の場合、なんと英語の大文字と小文字が区別されません。 つまりa …

no image

checkboxでの値の管理

formにてcheckboxの値を一つのカラムにいれて管理する機会があったのですが、これ入力更新出会っても検索であっても処理がなかなか厄介です。特に検索の時ですね・・・ 要するに値の候補が1,2,3, …