가끔 SQL문을 짜다보면 기본적으로 세로로 출력되는 리스트를 가로형태로 출력할 일들이 생긴다.

 예를 들자면...

 

              출근     지각     조퇴     병가     연차     출산     기타 

홍길동       5         6          1         3          7         4          2  

전우치       5         6          1         3          7         4          2  

구마적       5         6          1         3          7         4          2   

 

이런식으로 출력하고 싶다.

하지만 테이블을 조회해보면

 

 이름     구분 

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

홍길동     0    

홍길동     0   

홍길동     1   

홍길동     1   

홍길동     2   

홍길동     2   

홍길동     2   

홍길동     2   

홍길동     4   

홍길동     4   

전우치     0   

전우치     1   

전우치     3   

전우치     5   

전우치     8   

전우치     8   

전우치     4   

전우치     4   

전우치     6   

 

이런식으로 구분값과 함께 세로로 출력되고 있다.

자! 이제 이 데이터를 가지고 이름별 구분을 카운트 하는 SQL문을 짜보자..

먼저 잘 모르는.. 내자신..;;;; 나를 위해...;;

 

기초부터 설명하면.. (구분은 출근, 조퇴 등을 구분하는 코드값)

 

[SQL]

===================================================================================================

SELECT

     GT_NAME,  -- 이름

     GT_SITUATION,  -- 구분값

     COUNT(1) AS CNT
FROM 테이블명

WHERE REG_DATE BETWEEN '20070802' AND '20080831'
GROUP BY GT_NAME, GT_SITUATION

===================================================================================================

 

우선.. 이 쿼리문을 날리면...

 

[결과]

 GT_NAME     GT_SITUATION     CNT

   홍길동                0                  98

   홍길동                1                  32

   홍길동                3                  45

   홍길동                4                  12

   홍길동                5                  4  

   전우치                0                  58

   전우치                1                  66

   전우치                3                  7  

   전우치                4                  45

   전우치                5                  25

 

이런식으로 나올것이다..

홍길동이 가지고 있는 구분 "0"에 대한 카운트가 98개 이고 1에 대한 카운트가 32개.. 등등...

이런식으로 나올것이다.

이제 이 데이터를 가로로 나열하면 된다.

 

[SQL]

===========================================================================================================================

SELECT   

     GT_NAME,

     DECODE(GT_SITUATION, 0, CNT) AS CNT1,

     DECODE(GT_SITUATION, 1, CNT) AS CNT2,

     DECODE(GT_SITUATION, 2, CNT) AS CNT3,

     DECODE(GT_SITUATION, 3, CNT) AS CNT4

FROM (
    SELECT GT_NAME AS GT_NAME, GT_SITUATION AS GT_SITUATION, COUNT(1) AS CNT
    FROM 테이블명 
    WHERE GT_ID='12'
    AND REG_DATE BETWEEN '20070802000000' AND '20080831999999'
    GROUP BY GT_NAME, GT_SITUATION
)

===========================================================================================================================

 

DECODE를 이용해 SQL문을 날리면..

 

[결과] 

GT_NAME     CNT1     CNT2     CNT3     CNT4

  홍길동          98                                       

  홍길동                       32                          

  홍길동                                   45              

  홍길동                                                12 

 

이렇게 나온다..

그럼 이제 CNT의 빈공백들은 모두 없애야 된다.

어차피 가장 큰값을 가져오던 작은값을 가져오던 똑같다.

MAX함수를 쓰던 MIN함수를 쓰던 똑같다는 것이다.

여기서는 MIN 함수를 써서 빈공백들을 없애버리겠다.

그리고 마지막으로 GROUP BY GT_NAME 을 써주면 끝난다..

 

[SQL]

===========================================================================================================================

SELECT   

     GT_NAME,

     MIN(DECODE(GT_SITUATION, 0, CNT)) AS CNT1,

     MIN(DECODE(GT_SITUATION, 1, CNT)) AS CNT2,

     MIN(DECODE(GT_SITUATION, 2, CNT)) AS CNT3,

     MIN(DECODE(GT_SITUATION, 3, CNT)) AS CNT4

FROM (
    SELECT GT_NAME AS GT_NAME, GT_SITUATION AS GT_SITUATION, COUNT(1) AS CNT
    FROM 테이블명 
    WHERE GT_ID='12'
    AND REG_DATE BETWEEN '20070802000000' AND '20080831999999'
    GROUP BY GT_NAME, GT_SITUATION
) GROUP BY GT_NAME

===========================================================================================================================

 

[결과]

GT_NAME     CNT1     CNT2     CNT3     CNT4

   홍길동         98          32          45         12 

 

이렇게 원하는 결과값이 나올것이다!!

오라클 전문가들한테는 쉬운거겠지만...

나처럼 초짜에게는 이해하기가 쉽지 않았다...

하지만 개발을 하다보면 이렇게 가로로 출력해야 하는 경우도 종종 있게 마련이다.

더이상 까먹지 않게... 나를 위해.. 작성한다...

 

 

+ Recent posts