한 부서별 ID에 대한 출입수를 각월별로 정렬시키고 싶은데요 0 3 511

by 메로나 [SQL Query] [2022.01.18 16:44:38]


안녕하세요 매번 찾아보고 머리써보고 도무지 못찾아서 질문만 드리네요

=============================================
DEPT_CODE   DATE_GROUP   USER_ID WR_COUNT
=============================================
04001       201706       A       1     
04001       201706       B       2
04001       201706       C       2
04001       201706       D       3  
04001       201707       X       2
04001       201707       Y       2
04001       201707       Z       8
04001       201708       Q       2
04001       201708       R       1  
04001       201708       S       4 
04001       201708       T      22
04001       201709       G       1
04001       201709       H       3 

조회쿼리를 통해서 각 달별로 이런 데이터가 있습니다. 부서는 많기에 지정되도록 해서 특정값이 넘어옵니다(고정이라 보시면 됩니다)
각 월별로 특정 User ID에 대해서 출입횟수가 나오는데요 
예를들어 A라는 ID가 2017 06월에 존재하고 07월에는 없을 수도 있고 각달별로 있을 수도 없을 수도 있습니다.
06월에 없던 ID가 10월이나 11월에 나타날 수도 있구요

저 데이터를 행렬 바꾸기를 했어요 (참고로 오라클 10g입니다)

SELECT
    DECODE(DATE_GROUP, '201706', user_id, NULL) AS USER_ID1
    , DECODE(DATE_GROUP, '201706', wr_count, NULL) AS USER_ID1 
    , DECODE(DATE_GROUP, '201707', user_id, NULL) AS USER_ID2
    , DECODE(DATE_GROUP, '201707', wr_count, NULL) AS USER_ID2 
FROM
.............

이런식으로 DECODE를해서 그래서 아래와 같이 만들었습니다.

USER_ID1    201706   USER_ID2    201707   USER_ID3   201708    USER_ID4    201709
   A          1
   B          2 
   C          2 
   D          3
                        X          2 
                        Y          2 
                        Z          8
                                              Q        2           
                                              R        1 
                                              S        4 
                                              T        22    
                                                                  G           1
                                                                  H           3   

제가 원하는건 아래와 같이 

USER_ID1    201706   USER_ID2    201707   USER_ID3   201708    USER_ID4    201709
   A          1         X          2          Q        2          G          1
   B          2         Y          2          R        1          H          3 
   C          2         Z          8          S        4  
   D          3                               T        22 

이렇게 위로 밀어 올려서 표시되게 하는건데 

보통 예제나 그런거 찾아보면 DECODE이후 MAX()를 하여 한행으로 만들어버려서 저렇게 안나오네요

방법이 없을까요? 행별로 뭔가 키가 있어야 되는건지...

 

by 메로나 [2022.01.18 17:17:09]

행별로 키가 동일 해야 된다 생각하고 RANK()로 번호를 메겨서 같은 RANK() 값으로 그룹핑 해버렸는데요...

SELECT
    MAX(u001) AS u001
    , MAX(c001) AS c001
    , MAX(u002) AS u002
    , MAX(c002) AS c002
    , ........
FROM
(
    SELECT
        DECODE(DATE_GROUP, '201706', user_id, NULL) AS USER_ID1
        , DECODE(DATE_GROUP, '201706', wr_count, NULL) AS USER_ID1 
        , DECODE(DATE_GROUP, '201707', user_id, NULL) AS USER_ID2
        , DECODE(DATE_GROUP, '201707', wr_count, NULL) AS USER_ID2 
        .........
        , RANK() OVER (PARTITION BY DATE_GROUP ORDER BY user_id) AS RK
    FROM TABLEX
    .............
)
GROUP BY rk
ORDER BY rk ASC

이렇게 RK 값 만들어서 RK값으로 그룹핑시켜서 MAX 때리니 값이 나오는데 제대로 한건지 모르겠네요


 


by 마농 [2022.01.18 17:28:00]

맞긴 한데...
결과표가 보기 불편하지 않나요?
이렇게 월별 ID 컬럼을 두는 것 보다는.
ID 를 첫컬럼으로 하고 4개의 월별 카운트 컬럽을 두는게 보기 좋을 것 같아요.


by 메로나 [2022.01.18 18:12:54]

제가봐도 한쪽으로 ID몰면 보기 편할텐데 고객이 깡패죠 ㅠㅠ

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