SQL 질문과 답변 게시판
Microsoft SQL Server와 관련된 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
글 수 5,175
mssql2005에서는 rank() 함수가 지원되는걸로 알고 있습니다.
mssql2000에서는 지원이 안되 지금 자기 자신을 비교하여 쿼리를 만들었는데...
문제는 같은 값이면 순위가 같게 나옵니다.
code name count1 count2 rank
9 재무정보 66 66 1
18 인력정보 12 12 2
132 EDW 8 8 3
145 지식나들목 7 6 4
127 성과관리 6 6 5
26 지원정보 6 6 5
79 고객민원관리 4 4 7
4 기획경영 4 4 7
2 통합 4 4 7
66 영업정보 3 3 10
143 실시간경영정보 2 2 11
170 e-감사 2 2 11
125 메타데이터 1 1 13
57 자료실정보 1 1 13
이런식으루 나옵니다.
원하는거는 같은 값이여두 순위가 있어 한곳에서는 상위 5개만 다른 곳에서는 상위 5개를 제외한 결과값을 가져가야하는데
상위 4개는 쿼리문에 top 5 를 사용하면 되는데 상위 5개를 제외한 쪽에서는 어떻게 써야 할지를 모르겠습니다..
좀 알려주세요.. ㅠㅠ


(
select '009' code, '재무정보' name, 66 cnt1, 66 cnt2, 1 rnk from dual union all
select '018' code, '인력정보' name, 12 cnt1, 12 cnt2, 2 rnk from dual union all
select '132' code, 'EDW' name, 8 cnt1, 8 cnt2, 3 rnk from dual union all
select '145' code, '지식나들목' name, 7 cnt1, 6 cnt2, 4 rnk from dual union all
select '127' code, '성과관리' name, 6 cnt1, 6 cnt2, 5 rnk from dual union all
select '026' code, '지원정보' name, 6 cnt1, 6 cnt2, 5 rnk from dual union all
select '079' code, '고객민원관리' name, 4 cnt1, 4 cnt2, 7 rnk from dual union all
select '004' code, '기획경영' name, 4 cnt1, 4 cnt2, 7 rnk from dual union all
select '002' code, '통합' name, 4 cnt1, 4 cnt2, 7 rnk from dual union all
select '066' code, '영업정보' name, 3 cnt1, 3 cnt2, 10 rnk from dual union all
select '143' code, '실시간경영정보' name, 2 cnt1, 2 cnt2, 11 rnk from dual union all
select '170' code, 'e-감사' name, 2 cnt1, 2 cnt2, 11 rnk from dual union all
select '125' code, '메타데이터' name, 1 cnt1, 1 cnt2, 13 rnk from dual union all
select '057' code, '자료실정보' name, 1 cnt1, 1 cnt2, 13 rnk from dual
)
-- 상위 5개
SELECT Top 5
*
FROM (
SELECT a.code
, a.name
, a.cnt1
, a.cnt2
, COUNT(b.cnt1) + 1 rk_all
FROM t a
, t b
WHERE a.cnt1 < b.cnt1(+)
GROUP BY a.code, a.name, a.cnt1, a.cnt2
ORDER BY 5
)
with t as
(
select '009' code, '재무정보' name, 66 cnt1, 66 cnt2, 1 rnk from dual union all
select '018' code, '인력정보' name, 12 cnt1, 12 cnt2, 2 rnk from dual union all
select '132' code, 'EDW' name, 8 cnt1, 8 cnt2, 3 rnk from dual union all
select '145' code, '지식나들목' name, 7 cnt1, 6 cnt2, 4 rnk from dual union all
select '127' code, '성과관리' name, 6 cnt1, 6 cnt2, 5 rnk from dual union all
select '026' code, '지원정보' name, 6 cnt1, 6 cnt2, 5 rnk from dual union all
select '079' code, '고객민원관리' name, 4 cnt1, 4 cnt2, 7 rnk from dual union all
select '004' code, '기획경영' name, 4 cnt1, 4 cnt2, 7 rnk from dual union all
select '002' code, '통합' name, 4 cnt1, 4 cnt2, 7 rnk from dual union all
select '066' code, '영업정보' name, 3 cnt1, 3 cnt2, 10 rnk from dual union all
select '143' code, '실시간경영정보' name, 2 cnt1, 2 cnt2, 11 rnk from dual union all
select '170' code, 'e-감사' name, 2 cnt1, 2 cnt2, 11 rnk from dual union all
select '125' code, '메타데이터' name, 1 cnt1, 1 cnt2, 13 rnk from dual union all
select '057' code, '자료실정보' name, 1 cnt1, 1 cnt2, 13 rnk from dual
)
-- 상위 5개를 제외한 나머지
SELECT *
FROM (
SELECT a.code
, a.name
, a.cnt1
, a.cnt2
, COUNT(b.cnt1) + 1 rk_all
FROM t a
, t b
WHERE a.cnt1 < b.cnt1(+)
GROUP BY a.code, a.name, a.cnt1, a.cnt2
HAVING COUNT(b.cnt1) + 1 > 5
ORDER BY 5
)