database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 1181 게시물 읽기
No. 1181
[질문] 고난이도 SELECT문
작성자
이경훈(kalsome)
작성일
2004-02-10 19:14ⓒ
2004-02-10 19:15ⓜ
조회수
6,113

안녕하세요?

밥도 안먹고 계속 이거만 만지고 있습니다.

http://myhome.naver.com/slimpower/ttt.gif

 

가능할것도 같은데 도저히 제 돌머리로는 해결이 안됩니다.

감사합니다.

이 글에 대한 댓글이 총 3건 있습니다.

해결 했는지 모르게네요. 어렵다고 생각하면 어려운 문제일수도 있게네요. 조금 쉽게 생각하면 아주 쉬울수도 있고요.

먼저 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 tbl
group by name

 

오세억님이 2004-02-11 12:37에 작성한 댓글입니다. Edit

<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 three
FROM ( 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 tbl
GROUP BY pname
ORDER BY pname


---------------------------------------------------------------


* 뷰와 조인를 이용해도 되지 않을까 생각합니다
. [각 교수들의 학년별 지도학생수]를 뷰로 저장하고,
이것을 교수 테이블에 LEFT JOIN을 해주는데, [세번]을 해주면 됩니다.
왜 세번인지는 아실겁니다.
각 조인시마다 조인 조건에 [학년]이 포함되는데, 3학년까지 있기 때문입니다.

-- 뷰 : 각 교수들의 학년별 지도학생수
CREATE VIEW view_PSList
AS
SELECT p.pid, s.syear, Count(s.sid) AS scount
FROM PList p JOIN SList s ON p.pid = s.pid
GROUP BY p.pid, s.syear
go

-- 위의 뷰를 교수 테이블에 세번 LEFT JOIN
SELECT pname, IsNull(ps1.scount, 0) AS one, IsNull(ps2.scount, 0) AS two, IsNull(ps3.scount, 0) AS three
FROM 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문을 이용한 것과 똑같은 결과를 얻을 겁니다.

 

 

도움이 됐는지... 수고하세요.

김익한님이 2004-02-11 14:13에 작성한 댓글입니다.
이 댓글은 2004-02-11 14:18에 마지막으로 수정되었습니다. Edit

감사합니다.

하늘 밖에 하늘이 있는것을 깨달았습니다.

맨첨에 여기 database.sarang.net의 디자인이

꾸져서 별로라구 생각했는데

자세히 보니까 내용들이 매우 알찼습니다.

 

혹시나 해서 질문을 드렸는데

너무도 완벽하게 되었습니다.

 

정말 너무나도 감사드립니다.

건강하세요.

 

오세억님,김익학님 로또 1등 당첨되시구요 ^_^

이경훈(kalsome)님이 2004-02-11 15:58에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
1184쿼리좀 봐주세용~ [1]
손오공
2004-02-11
3565
1183질문 : 어제 초고난이도 SELECT에서 마지막 질문 [2]
이경훈
2004-02-11
3593
1182osql문을 사용하여 bat파일을 돌리면 Server의 메모리를 너무 차지
이동수
2004-02-11
3550
1181[질문] 고난이도 SELECT문 [3]
이경훈
2004-02-10
6113
1180내용에 있는 한자를 제거하여 Select 할 수 있는 방법은 어떤게 있을까요? [1]
권윤길
2004-02-10
4411
1179테이블이름을 검색해서 없으면 만들어주게 할 수 있나요? [1]
세라비
2004-02-10
3586
1178Client에서 MS-SQL 서버에 연결하기 [1]
김용옥
2004-02-09
4581
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다