가끔 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
이렇게 원하는 결과값이 나올것이다!!
오라클 전문가들한테는 쉬운거겠지만...
나처럼 초짜에게는 이해하기가 쉽지 않았다...
하지만 개발을 하다보면 이렇게 가로로 출력해야 하는 경우도 종종 있게 마련이다.
더이상 까먹지 않게... 나를 위해.. 작성한다...
'프로그래밍 > SQL' 카테고리의 다른 글
오라클(Oracle) 날짜계산 (0) | 2013.11.11 |
---|---|
오라클(Oracle) REPLACE 함수와 TRANSLATE 함수의 문자 치환 (0) | 2013.11.11 |
오라클(Oracle) 최근 3개월 데이터 조회 조건문 (0) | 2013.11.11 |
오라클(Oracle) 날짜 함수 LAST_DAY, ADD_MONTHS (1) | 2013.11.06 |
오라클(ORACLE) SQL - SELECT 검색조건 ALL, ANY (0) | 2013.11.05 |
댓글