chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

情報技術者試験のSQLの問題

子供に情報技術者試験の問題を聞かれて答えられなかった。DISTINCTとかEXISTS,HAVINGなんて使ったことないし。
分からないままではいかんので、自分でもSQLを書いてみることにした。

社員テーブルより、職務がプログラマである社員が5人未満の部署の
部署コードを探すSQLはどれか

<社員テーブル>
|社員番号|社員名|部署コード|職務|


SELECT DISTINCT 部署コード FROM 社員 S1
   WHERE 5 > (SELECT COUNT(S2.社員番号) FROM 社員S2
              WHERE S1.部署コード = S2.部署コード
              AND S2.職務 = 'プログラマ')
      

SELECT DISTINCT 部署コード FROM 社員 S1
   WHERE 5 < (SELECT COUNT(S2.社員番号) FROM 社員S2
              WHERE S1.部署コード = S2.部署コード
              AND S2.職務 <> 'プログラマ')
      

SELECT DISTINCT 部署コード FROM 社員 S1
   WHERE EXISTS (SELECT * FROM 社員S2
                 WHERE S1.部署コード = S2.部署コード
                 AND S2.職務 = 'プログラマ')
   GROUP BY S1.部署コード HAVING COUNT(*) < 5
      

SELECT DISTINCT 部署コード FROM 社員 S1
   WHERE S1.部署コード IN (SELECT S2.部署コード FROM 社員 S2
                            WHERE S1.部署コード = S2.部署コード
                            AND S2.職務 = 'プログラマ'
                            GROUP BY S1.部署コード HAVING COUNT(*) < 5)

試行錯誤の結果、部課コードごとのプログラマの数をまとめるSQLはできた

SELECT S1.`部署コード` , COUNT(*) FROM  社員テーブル S1  
                 WHERE ( S1.`職務` = 'プログラマ' ) 
                 GROUP BY S1.`部署コード`

上記を副問い合わせとして、親のSQLを作ればいいのだろうか。。 もうちょっと勉強しないと分からない。