BLANK, NULL AND BLACK

앞의 피벗 기능을 활용한 데이터 뽑기의 진화버전(?) 이다.


잠깐 다시 설명해 보자면

정상적인 회사라면 급여지급 정보는 매달 반복될것이고, 직원들 사번(또는 고유 아이디) 또한 매번 반복될 것이다.

그렇다면 자료 요청자가 급여지급 월의 범위를 지정해서 자료요청을 할텐데

그 범위가 이전달 또는 최근 2개월 정도 일수도 있지만

2014년 전체의 정보를 보고싶다던가 (그나마 다행)

2014년 3월 부터 2015년 6월 까지의 데이터를 보여달라는 등의 희한한 요구도 있을 수 있겠다.


그러면 앞의 방법에서는 요청한 급여지급월을 하나씩 SELECT 문에 적어줘야 했었다. (생각만 해도.... )

물론 엑셀이나 기타 프로그램을 이용하여 자동완성 기능을 사용하면 생각보다 시간이 절약되기도 한다.

하지만 목마른 사람이 우물을 파듯이 불편하면 만들어야지 뭐~.



우선 예를 들어 위에서 나온 2014년 3월 부터 2015년 6월 까지의 데이터를 요청 받았다 라고 해보자.

[2014-03], [2014-04], [2014-05], [2014-06] ........ [2015-06] 

급여정보는 위와 같은 식으로 데이터가 나와야 되겠고, 제일 앞에는 사번과, 이름 정도가 나오면 알아보기 쉽겠다.

사번, 이름, [2014-03], [2014-04], [2014-05], [2014-06] ........ [2015-06] 


여기서 생각해야 될 것이 직원이 50명이라면 

2014년 3월에 50명의 급여정보

2014년 4월에 50명의 급여정보.... 처럼 매월*50명의 데이터가 나오게 된다.

같은 [연도-월] 정보가 50개씩 나오니 비효율적이다.


변수를 하나 만들어서 중복되지 않는 데이터만 넣어놓자.


DECLARE @MONTH VARCHAR(MAX) SET @MONTH = ''

SELECT

    @MONTH = @MONTH + A.지급월

FROM

    (

        SELECT

            DISTINCT '[' + 지급월 + '], ' AS 지급월

        FROM

            PAYMENT_TBL

        WHERE

            지급월 BETWEEN '2014-03' AND '2015-06'

    ) A

ORDER BY

    A.지급월


"[ ]" 괄호와 괄호 뒤에 붙어 있는 "," 콤마, ORDER BY(지급월 순서) 는 추후 @MONTH 변수의 내용을 컬럼이름으로 활용하기 위한 방법이다.

SELECT @MONTH 를 해보면 문자열 형태로 쭉 붙어서 들어갔다.


이제 실제로 데이터를 출력할 쿼리를 만들어보자.

변수를 하나 더 만들어서 그 안에 문자열 형태로 쿼리문을 조합하고, EXEC로 실행 시킬 것이다.


DECLARE @SQL VARCHAR(MAX) 

SET @SQL = '

                      SELECT

                          사번, 이름, '

                          + LEFT(@MONTH, LEN(@MONTH)-1) + '

                      FROM

                           (

                               SELECT

                                   사번, 이름, 지급월, 금액

                               FROM

                                   PAYMENT_TBL

                           ) A

                      PIVOT

                          (

                              SUM(금액)

                              FOR 지급월 IN (' + LEFT(@MONTH, LEN(@MONTH)-1) + '

                          ) B

                  '

EXEC (@SQL)


이러하다.

기본적으로 MSSQL의 PIVOT 의 문법을 따르며, 자료요청 시 마다 달라질 수 있는 지급월 정보는 변수로 처리한다.


LEFT() 함수를 사용한 이유는 @MONTH 에 들어있는 데이터 마지막에 "," 콤마가 있는 것을 알 수 있다.

마지막 콤마는 에러를 일으키기 때문에 없애줘야 하고

그 외에는...... PIVOT 이라는 낯선 키워드를 사용한거 말곤 충분히 이해할 수 있는 내용인듯 하다.


추후에는 CASE문을 사용하는 방법을 위와 같은 진화된 방법으로 실습해봐야겠다.

까먹지말자.


'MS-SQL' 카테고리의 다른 글

LOG 파일 용량 줄이기  (0) 2017.08.07
'sa' 계정으로 로그인 안됨  (0) 2017.01.16
ROW ↔ COLUMN (PIVOT)  (0) 2016.04.14
계층구조 쿼리 (CTE)  (0) 2015.10.20
다수의 NULL 컬럼에 순차번호 넣기  (0) 2015.07.01