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
운영게시판
최근게시물
DB2 Q&A 1616 게시물 읽기
No. 1616
디비쿼리문좀 만들어주세요~
작성자
윤동민(tersa01)
작성일
2008-05-26 18:16ⓒ
2008-05-26 18:41ⓜ
조회수
11,318

select c.uname, count(*) from mrole_entrust a, userinfo_temp b,mcodedesc c

 where b.employeenumber = a.fromuser and b.brnchofficcd = c.uuid and mcode_uuid = 101

 group by c.uname



도움좀 부탁드리겠습니다


이렇게 쿼리를 날리면 부서이름 , 부서별 테이터 갯수가 나옵니다.


문제는....


순위를 구해야되는데요



순위               부서명                횟수                 백분율

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

1                   총무부                 12회              30.0%

2                   지점A                   5회               12.5%

3                   지점B                   3회                7.5%

4                   지점C                   2회                5.0%

5                   지점D                   2회                5.0%

                    기타                    16회               40.0%

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

                     계                      40회               100.0%


이렇게 나와야합니다.

저기서 5위까지만 나오면 나머지는 기타로 처리를 해야되는데 

뭘써야될지 모르겠습니다.


앞에 순위도 어떻게 찍어야할지 모르겠고요..


이모든걸 쿼리만 사용해야합니다... 프레임웍에서 값을 받아서 뿌려주는 처리만해서

쿼리로 모든걸 해결해야되는 상황이라 난해하네요.

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

with t1(c1,c2) as (values
('지점A', 5),
('총무부',12),
('지점C', 2),
('지점D', 2),
('지점B', 3),
('E',1),
('BB',1),
('GG',1)),
t2(ca) as (values (1),(2))

select case when rk<6 and ca=1 then rk else cast(null as int) end rk,
       case when rk<6 and ca=1 then c1     
            when rk>5 and ca=1 then '기타'
            when ca=2 then '계' end c1,
       sum(c2) c2, int(dec(sum(c2))/max(sm)*100) pct
 from (
select c1,c2,rownumber() over(order by c2 desc) rk,sum(c2) over() sm from t1
      ) t1 , t2
group by case when rk<6 and ca=1 then rk else cast(null as int) end,
         case when rk<6 and ca=1 then c1    
              when rk>5 and ca=1 then '기타'
              when ca=2 then '계' end;
~

RK                   C1     C2          PCT       
-------------------- ------ ----------- -----------
                   1 총무부          12          44
                   2 지점A            5          18
                   3 지점B            3          11
                   4 지점C            2           7
                   5 지점D            2           7
                   - 기타             3          11
                   - 계              27         100

조는 냥이님이 2008-05-27 09:25에 작성한 댓글입니다.
이 댓글은 2008-05-27 11:03에 마지막으로 수정되었습니다. Edit

select case when rnk <6 then rnk else cast(null as int) end rnk,
 case when rnk<6 then uname else '기타' end uname,sum(cnt) cnt

          from (select uname, cnt, rank() over(order by cnt desc) rnk
                  from (select c.uname, count(*) as cnt
 from mrole_entrust a, userinfo_temp b,mcodedesc c
 where b.employeenumber = a.fromuser and b.brnchofficcd = c.uuid and mcode_uuid = 101
 and  startdate between '20080610' and '20080620'
 group by c.uname) a) b
 group by case when rnk<6 then rnk else cast(null as int) end, case when rnk<6 then uname else '기타' end;


답변주신대로 응용해서 짜보았습니다 잘되네요 ^^ 감사합니다.
하나더 질문,... 백문율도 구해야되는데 어떻게 구해야될까요....
점점더 막막해지네요~

고수님들 지나가지마시고 댓글한번 ^^

윤동민(tersa01)님이 2008-05-27 13:27에 작성한 댓글입니다.
select case when rnk <6 then rnk else cast(null as int) end rnk,
 case when rnk<6 then uname else '기타' end uname,sum(cnt) cnt,int(dec(sum(cnt))/max(sm)*100) pct
          from (select uname, cnt, rownumber() over(order by cnt desc) rnk,sum(cnt) over() sm
                  from (select c.uname, count(*) as cnt
 from mrole_entrust a, userinfo_temp b,mcodedesc c
 where b.employeenumber = a.fromuser and b.brnchofficcd = c.uuid and mcode_uuid = 101
 and  startdate between '20080610' and '20080620'
 group by c.uname) a) b
 group by case when rnk<6 then rnk else cast(null as int) end, case when rnk<6 then uname else '기타' end;

냥이님~ 해결됐어요~ 감사드려요 마지막 한가지.. int가 아니고 소숫점 첫째짜리까지 표기를 할려면
어떻게 해야될까요...
그리고 날짜에서 받아오는건 varchar 타입이고 디비는 타임스템프인데... 어떤식으로 변환을 해야될까요...
제가 받아오는 문자는 yyyymmdd 인데... 타임스템프와 비교를 하려면..

불가능할줄 알았는데 가능하긴가능하네요.. 어렵네요 이거 ^^;;

냥이님 한번 더 감사합니다.
윤동민(tersa01)님이 2008-05-27 13:35에 작성한 댓글입니다.
이 댓글은 2008-05-27 13:50에 마지막으로 수정되었습니다.

1. 소숫점 첫째짜리까지 표기


 dec(dec(sum(c2))/max(sm)*100,4,1) pct



2. 날짜에서 받아오는건 varchar 타입이고 디비는 타임스템프인데... 어떤식으로 변환을 


SELECT TIMESTAMP('1997-01-11-22.44.55.000000')

            ,TIMESTAMP('1997-01-11-22.44.55.000')

            ,TIMESTAMP('1997-01-11-22.44.55')

            ,TIMESTAMP('19970111224455')

            ,TIMESTAMP('1997-01-11','22.44.55')

   FROM staff

WHERE id = 10;

Figure 430, TIMESTAMP function examples


조는 냥이님이 2008-05-27 13:52에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1619날짜관련문제... [3]
윤동민
2008-05-29
11776
1618스토어드프로시저 빌드관련 문제 [11]
박경욱
2008-05-29
10821
1617조인 관련 질문드립니다. [3]
이도희
2008-05-27
10401
1616디비쿼리문좀 만들어주세요~ [4]
윤동민
2008-05-26
11318
1615간단한 시간질문 [2]
윤동민
2008-05-26
9959
1613자바 어플리케이션 개발 예제
김기복
2008-05-26
10490
1612DB2 database 생성시 이름 제한 푸는법이 있나요?
박경욱
2008-05-25
10560
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다