안녕하세요?
밥도 안먹고 계속 이거만 만지고 있습니다.
http://myhome.naver.com/slimpower/ttt.gif
가능할것도 같은데 도저히 제 돌머리로는 해결이 안됩니다.
감사합니다.
해결 했는지 모르게네요. 어렵다고 생각하면 어려운 문제일수도 있게네요. 조금 쉽게 생각하면 아주 쉬울수도 있고요.
먼저 case 키워드를 이용한 크로스탭쿼리와 인라인 뷰를 이요하시면 되게네요. 이게 답은 아니지만 더 좋은 방법은 많겠죠. 더 나은 알고리즘을 세우시는분 공개하시면 좋게네요.
select * from 교수 join 학생 on 교수.pid=학생.pid
select name,count(y1),count(y2),count(y3)from ( select 교수.pid,name, case syear when 1 then ( select count(sid) from 학생 as A where a.pid=교수.pid and sYear=1) end as y1,case syear when 2 then ( select count(sid) from 학생 as A where a.pid=교수.pid and sYear=2) end as y2,case syear when 3 then ( select count(sid) from 학생 as A where a.pid=교수.pid and sYear=3) end as y3
from 교수 join 학생 on 교수.pid=학생.pid group by 교수.pid,name,syear ) As tblgroup by name
<pre>
* 앞의 답글에서 방법 자체를 제대로 말씀하신것 같습니다.하지만, 최종 SELECT 문에서 COUNT가 아닌 SUM 함수를 써줘야 합니다.널값을 '0'으로 대체하는 것까지 추가하여 수정한 것은 다음과 같습니다.-- PList : 교수 테이블-- SList : 학생 테이블SELECT pname, Sum(IsNull(y1, 0)) AS one, Sum(IsNull(y2, 0)) AS two, Sum(IsNull(y3, 0)) AS threeFROM ( SELECT p.pid, pname,
Case syear WHEN 1 THEN ( SELECT Count(sid) FROM SList AS A WHERE a.pid=p.pid and sYear=1) END AS y1,
Case syear WHEN 2 THEN ( SELECT Count(sid) FROM SList AS A WHERE a.pid=p.pid and sYear=2) END AS y2,
Case syear WHEN 3 THEN ( SELECT Count(sid) FROM SList AS A WHERE a.pid=p.pid and sYear=3) END AS y3
FROM PList p join SList s ON p.pid=s.pid GROUP BY p.pid, pname, syear ) AS tblGROUP BY pnameORDER BY pname---------------------------------------------------------------* 뷰와 조인를 이용해도 되지 않을까 생각합니다. [각 교수들의 학년별 지도학생수]를 뷰로 저장하고,이것을 교수 테이블에 LEFT JOIN을 해주는데, [세번]을 해주면 됩니다.왜 세번인지는 아실겁니다.각 조인시마다 조인 조건에 [학년]이 포함되는데, 3학년까지 있기 때문입니다.-- 뷰 : 각 교수들의 학년별 지도학생수CREATE VIEW view_PSListASSELECT p.pid, s.syear, Count(s.sid) AS scountFROM PList p JOIN SList s ON p.pid = s.pidGROUP BY p.pid, s.syeargo-- 위의 뷰를 교수 테이블에 세번 LEFT JOINSELECT pname, IsNull(ps1.scount, 0) AS one, IsNull(ps2.scount, 0) AS two, IsNull(ps3.scount, 0) AS threeFROM PList p Left JOIN view_PSList ps1 ON p.pid = ps1.pid and ps1.syear = 1
Left JOIN view_PSList ps2 ON p.pid = ps2.pid and ps2.syear = 2
Left JOIN view_PSList ps3 ON p.pid = ps3.pid and ps3.syear = 3
ORDER BY pname
이것으로 첫번째 CASE문을 이용한 것과 똑같은 결과를 얻을 겁니다.
도움이 됐는지... 수고하세요.
하늘 밖에 하늘이 있는것을 깨달았습니다.
맨첨에 여기 database.sarang.net의 디자인이
꾸져서 별로라구 생각했는데
자세히 보니까 내용들이 매우 알찼습니다.
혹시나 해서 질문을 드렸는데
너무도 완벽하게 되었습니다.
정말 너무나도 감사드립니다.
건강하세요.
오세억님,김익학님 로또 1등 당첨되시구요 ^_^