• ベストアンサー

技術評論社 SQL書き方ドリルの疑問点

現在 技術評論社の「SQL書き方ドリル」で勉強中のものです。 答え合わせをしていて疑問に思った点があったので質問させていただきます。 第3章 その4 「外部結合を使う」 第5問(P168)の答えでGROUP BYを使わなくてもよい理由はなんでしょうか? 問題文ではEmployeeごとと指定がありますので、サブクエリの中でEmployeeIDをグループ化しなくてはいけないような気がするのですが・・・。 どなたか回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

Salary テーブルの index がどうなってるかによります。 データ自体は、参考例に1,2行あればいいので、create 文の方を載せてほしかったですね。カラム区切りも解らなくなっていて、ほとんど載せる意味がない。 テーブルの意義から言って、Salaryテーブルでは、日付とEmployeeIDが決まれば、一行しか存在しないことが必要だと思いますが、もし、この2カラム連動でのunique index を貼っていなくて、同日に同一者に多重支払いしている行が存在するなら、Bと名付けたサブクエリ内でgroup by EmployeeID として、取得結果側カラムは sum(Amount) as Amount とする必要があるでしょう。 でも、現実の状況で、もし、同じ日付&同じEmployeeIDで複数行あったら、バグ扱いになりそ。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

「その本の所持者だけに限る」でなければ 問題文を書いてみてください。

renyskm
質問者

補足

ご返信有難うございます。 必要な情報を全て書くと長くなるので、所有している方限定と思いましたが、なるべく多くの方に回答していただきたいので書こうと思います。 <問題>テーブルEmployees、SalaryからEmployeeごとの'2007-02-25'支給のAmountを求めて、EmployeeName、Amount(別名は「支給額」)を表示しなさい。Amountデータが存在しない場合は0を表示しなさい。 <解答> SELECT A.EmployeeName , (CASE WHEN B.Amount IS NULL THEN 0 ELSE B.Amount END) AS 支給額 FROM Employees AS A LEFT OUTER JOIN (SELECT EmployeeID ,Amount FROM Salary WHERE PayDate = '2007-02-25' ) AS B ON A.EmployeeID = B.EmployeeID ; <DB> ●Employeesテーブル EMPLOYEEID EMPLOYEENAME HEIGHT EMAIL WEIGHT HIREFISCALYEAR BIRTHDAY BLOODTYPE 1 シマゴロー 168 simagoro@nekoyasudo 72 1987 1956/10/1 A 2 ゴッチン 161 gochin@nekoyasudo 60 1987 1953/12/25 B 3 マキ子 155 maki@nekoyasudo 52 1987 1958/8/16 O 4 マル 158 maru@nekoyasudo 45 1987 1954/1/12 AB 5 ミチロー 170 michiro@nekoyasudo 70 1987 1965/2/14 A 6 チー 173 coo@nekoyasudo 76 1987 1964/9/15 A 7 サラ 162 sara@nekoyasudo 50 1988 1960/10/28 A 8 みなみ 153 minami@nekoyasudo 42 1988 1962/9/3 O 9 プリン 148 prin@nekoyasudo 48 1988 1968/3/14 B 10 ぴー子 156 pko@nekoyasudo 52 1988 1971/11/13 O 11 ごま 180 goma@nekoyasudo 78 1988 1971/4/15 O 12 ぱんだ 185 panda@nekoyasudo 95 1988 1971/6/1 B 13 猫丸 172 nekomaru@nekoyasudo 80 1989 1972/1/15 B 14 ニャン太 178 nyantaro@nekoyasudo 58 1989 1972/2/3 B 15 モンチー 169 monchi@nekoyasudo 55 1991 1973/5/6 A 16 ぴよ 155 piyo@nekoyasudo 62 1991 1973/7/14 A 17 ラスカル 165 rasukal@nekoyasudo 51 1992 1974/4/10 AB 18 くま 190 kuma@nekoyasudo 115 1992 1970/3/3 O 19 ゴン 176 gon@nekoyasudo 78 1993 1975/11/16 O 20 チー 169 q@nekoyasudo 56 1994 1976/5/25 O 21 太助 164 tasuke@nekoyasudo 50 1996 1978/10/3 B 22 トントン 155 tonton@nekoyasudo 45 1996 1978/12/25 B 23 マー 158 ma@nekoyasudo 44 1997 1979/4/3 A 24 サリー 149 sary@nekoyasudo 38 1999 1981/2/2 A 25 うさぎ 161 usa@nekoyasudo 43 1999 1981/8/8 A 26 うー太 170 uta@nekoyasudo 63 2001 1983/3/26 A 27 ローリー 147 roly@nekoyasudo 40 2003 1985/5/26 A 28 マイケル 160 mikel@nekoyasudo 49 2004 1986/6/30 AB 29 スー 163 su@nekoyasudo 52 2006 1988/9/8 O 30 ミーヤ 168 miya@nekoyasudo 51 2007 1989/7/7 B ●Salaryテーブル SALARYID PAYDATE AMOUNT EMPLOYEEID 1 2006/9/25 580000 1 2 2006/9/25 450000 2 3 2006/9/25 410000 3 4 2006/9/25 380000 4 5 2006/9/25 350000 5 6 2006/9/25 350000 6 7 2006/9/25 330000 7 8 2006/9/25 330000 8 9 2006/9/25 320000 9 10 2006/9/25 300000 10 11 2006/9/25 300000 11 12 2006/9/25 300000 12 13 2006/9/25 280000 13 14 2006/9/25 280000 14 15 2006/9/25 260000 15 16 2006/9/25 260000 16 17 2006/9/25 250000 17 18 2006/9/25 290000 18 19 2006/9/25 240000 19 20 2006/9/25 230000 20 21 2006/9/25 210000 21 22 2006/9/25 210000 22 23 2006/9/25 200000 23 24 2006/9/25 180000 24 25 2006/9/25 180000 25 26 2006/9/25 175000 26 27 2006/9/25 165000 27 28 2006/9/25 160000 28 29 2006/9/25 150000 29 30 2006/10/24 580000 1 31 2006/10/24 450000 2 32 2006/10/24 410000 3 33 2006/10/24 380000 4 34 2006/10/24 350000 5 35 2006/10/24 350000 6 36 2006/10/24 330000 7 37 2006/10/24 330000 8 38 2006/10/24 320000 9 39 2006/10/24 300000 10 40 2006/10/24 300000 11 41 2006/10/24 300000 12 42 2006/10/24 280000 13 43 2006/10/24 280000 14 44 2006/10/24 260000 15 45 2006/10/24 260000 16 46 2006/10/24 250000 17 47 2006/10/24 290000 18 48 2006/10/24 240000 19 49 2006/10/24 230000 20 50 2006/10/24 210000 21 51 2006/10/24 210000 22 52 2006/10/24 200000 23 53 2006/10/24 180000 24 54 2006/10/24 180000 25 55 2006/10/24 175000 26 56 2006/10/24 165000 27 57 2006/10/24 160000 28 58 2006/10/24 150000 29 59 2006/11/25 580000 1 60 2006/11/25 450000 2 61 2006/11/25 410000 3 62 2006/11/25 380000 4 63 2006/11/25 350000 5 64 2006/11/25 350000 6 65 2006/11/25 330000 7 66 2006/11/25 330000 8 67 2006/11/25 320000 9 68 2006/11/25 300000 10 69 2006/11/25 300000 11 70 2006/11/25 300000 12 71 2006/11/25 280000 13 72 2006/11/25 280000 14 73 2006/11/25 260000 15 74 2006/11/25 260000 16 75 2006/11/25 250000 17 76 2006/11/25 290000 18 77 2006/11/25 240000 19 (以下 353行目まで続く・・・ 以上です。文字数制限の都合上省略になりますが、よろしくお願いします。

関連するQ&A