같은 데이터 ROW 합치기 질문입니다 0 4 1,004

by nodeLosck [SQL Query] [2018.10.08 18:16:22]


안녕하세요 

 

쿼리 관련 질문이 있어서 조언을 얻고자 문의드립니다.

 

 SELECT
        ACMP_INTT_NM,
        CNT ,
        RK   
    FROM
        (   SELECT
            ACMP_INTT_NM || '('||SUM(TOT_SUM)||')' AS ACMP_INTT_NM ,
            COUNT(CNT) AS CNT,
            DENSE_RANK() OVER (
        ORDER BY
            COUNT(RK) DESC ) AS RK                      
        FROM
            (                        SELECT
                D.ACMP_INTT_NM ,
                D.TOT_SUM ,
                D.PJT_ID AS CNT,
                DENSE_RANK() OVER (
            ORDER BY
                COUNT(D.PJT_ID) DESC ) AS RK                                               
            FROM
                RMTN_PJT_HIS_MAST RPHM,
                RMTN_AGRN_INFM RAI,
                RMTN_PJT_HIS A ,
                RMTN_PJT_ACMP_INTT_HIS D                           
            WHERE
                RPHM.PJT_ID = RAI.PJT_ID                            
                AND RPHM.PJT_SEQNO = RAI.PJT_SEQNO                            
                AND RAI.AGRN_PRGS_STTS_CD = 'P0500202'                
                AND RAI.AGRN_DATE LIKE '%'|| '2018' /**P*/||'%'               
                AND RPHM.PJT_ID = A.PJT_ID                                
                AND RPHM.PJT_SEQNO = A.PJT_SEQNO                            
                AND RPHM.HIS_SEQNO = A.HIS_SEQNO                                 
                AND RPHM.PJT_ID = D.PJT_ID                                
                AND RPHM.PJT_SEQNO = D.PJT_SEQNO                            
                AND RPHM.HIS_SEQNO = D.HIS_SEQNO               
                AND A.PJT_DSNC_CD <> 'P0305004'                                                                      
            GROUP BY
                D.ACMP_INTT_NM,
                D.TOT_SUM,
                D.PJT_ID             )                
        GROUP BY
            ACMP_INTT_NM               ) E             
        WHERE
            RK < = 5  
        GROUP BY
            ACMP_INTT_NM,
            CNT,
            RK   
        ORDER BY
            CNT DESC   

 

해당 쿼리 조회 시

충남대학교(1970397000)    5    1
한국과학기술원(2747829000)    5    1
연세대학교(2874105000)    4    2
조선대학교(680458600)    4    2
중앙대학교(755360000)    4    2
건국대학교(718886000)    3    3
국민대학교(578463000)    3    3
성균관대학교(1536378000)    3    3
울산과학기술원(656969000)    3    3
인하대학교(1775278000)    3    3
전남대학교(4168864800)    3    3
전북대학교(1584276000)    3    3
포항공과대학교(1693584000)    3    3
한밭대학교(619620000)    3    3
가천대학교(1747488000)    2    4
강원대학교(1188117000)    2    4
경북대학교(401520000)    2    4
고려대학교(1259688000)    2    4
동국대학교(412248000)    2    4
동신대학교(524910000)    2    4
명지대학교(1620497000)    2    4
목포대학교(1597839000)    2    4
서울대학교(364290000)    2    4
아주대학교(490460000)    2    4
한국산업기술대학교(1361292000)    2    4
호서대학교(444000000)    2    4
홍익대학교(1805460000)    2    4
경남대학교(187800000)    1    5
경희대학교(2235000000)    1    5
광운대학교(186000000)    1    5
군산대학교(1029102000)    1    5
대진대학교(61410000)    1    5
덕성여자대학교(1172600000)    1    5

 

형식의 데이터 출력되는데 마지막 컬럼 데이터(랭크) 기준으로 묶어서 1개 로우로 보여줄수 있는 방법이 있을까요??? 

ex) 랭크 값이 1인 데이터들을 ROW 하나로 대진대학교,덕성여자대학교 외 11건

by 야신 [2018.10.09 08:00:00]
WITH t(empno, ename,yn, deptno) AS ( SELECT 7369,'Kim','Y',10 FROM dual UNION ALL
                                              SELECT 7844,'Park','Y',10 FROM dual  UNION ALL
                                              SELECT 7566,'Hong','Y',10 FROM dual  UNION ALL
                                              SELECT 9997,'Lim','Y',20 FROM dual UNION ALL
                                              SELECT 9999,'Lee','Y',20 FROM dual UNION ALL
                                              SELECT 9900,'Fee','Y',30 FROM dual)
SELECT deptno
, MAX(DECODE(rn,1,ename)) ename1
, MAX(DECODE(rn,2,ename)) ename2
, MAX(grp_cnt-2)          etc_cnt
, MAX(DECODE(rn,1,ename)) ||NVL2(MAX(DECODE(rn,2,ename)),','||MAX(DECODE(rn,2,ename)),'')
||CASE WHEN MAX(grp_cnt-2) >0 THEN '외 '||MAX(grp_cnt-2)||' 건' END AS disp_nm
FROM (                                              
        SELECT t.*, row_number() OVER(PARTITION BY deptno ORDER BY empno) rn
        ,      COUNT(*) OVER(PARTITION BY deptno) grp_cnt
        FROM t                                              
     )
GROUP BY deptno     

 


by 마농 [2018.10.10 09:29:34]

1. 제일 첫단계 인라인뷰가 왜 필요한지 의문이네요?
 - dense_rank 는 왜 하는건지?
 - group by 는 왜 하는건지?
 - 혹시 중복이 발생하여 중복제거를 하기 위해 사용한 거라면?
 - 중복제거를 group by 로 할게 아니라 조인조건을 더 추가하여 중복제거를 해야 합니다.
2. '2018' 은 연도 조건인가요?
 - 양쪽 '%' Like 조건절이 애매합니다.
3. 질문이 모호합니다.
 - 원하시는 결과를 원본예시 대비하여 정확하게 표현해 주세요.


by nodeLosck [2018.10.10 10:05:23]

 답변 감사합니다.

현재 목표는 CNT(a기관의 갯수)로 순위 1~5위 까지 출력 후 CNT가 같은 항목들은  ACMP_INTT_NM  묶어서 ROW 한줄로 표현하는게 목표였습니다...


by 마농 [2018.10.10 10:13:54]

목표를 길게 설명하시는 것도 좋지만, 설명만으로는 부족합니다.
실제 결과자료를 적어주세요. 원본결과 예시와 연동하여 적어주세요.
그리고... 맨 안쪽 인라인뷰(group by, dense_rank)를 사용한 이유는 뭔가요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입