• 다소 쌩뚱맞긴 합니다만... ^^;; 
    통계작업에 유용하게 사용할 수 있는 달력테이블을 만들어서 사용하기도 합니다. 
    create table 달력 (년 varchar2(4), 월 varchar2(2), 일 varchar2(2), 년월일 varchar2(8)); 
    요로코롬 말이지요. 
    말씀하시는바와 같이 화면에 임의의 년에대한 모든 월데이터를 보인다던가.. 할때 유용하게 사용할 수 있지요.
    통계화면이 한두개가 아니다보니.. 요로코롬 미리 테이블을 구성한 후 join으로 이용하는것도 꽤 괜찮은 방법입니다. 
    DBA님이나 사수분께 의논해보심은 어떠시련지요. ^^;; 
    아니면.. 제 오래된 기억에 mssql 2000의 경우엔 템프테이블을 만들 수 있는 방법이 있었는데요.. 
    요 템프테이블을 달력테이블처럼 구성하여 사용하셔도 될듯 합니다. 
    그럼 ^^;;
  • dazzilove

from
http://okjsp.pe.kr/seq/117001

통계 시 실제 데이터가 없는 일/월/연을 0건으로 표시하기 위해서 위와 같은 처리가 필요.
아님

  • select 1 as month, 0 as cnt 
    from dual 
    union all 
    select 2 as month, 0 as cnt 
    from dual 
    union all 
    select 3 as month, 0 as cnt 
    from dual 
    union all 
    select 4 as month, 0 as cnt 
    from dual 
    union all 
    select 5 as month, 0 as cnt 
    from dual 
    .... 

    으로 가라로 뷰를 하나 만든다음에 outer join 하면 되지 않을까요?
  • mgcos

이건 넘 쿼리가 길어지는 듯....

/*OUTER JOIN 테스트용.
임시로 월간 캘린더 테이블을 만들어서 실제 데이타와 조인. 그런 다음 갯수를 세면 데이터가 없는 월의 것도 카운트 가능해진다
임시 테이블을 만들어서 데이타를 뽑아내긴 하였으나, 검색기간이 동적으로 변하므로 그것에 대한 처리는 어떻게 하는가?
실제 물리적인 테이블에 모든 데이타를 넣어두어 그것을 가지고 해야하지 않나?
*/
SELECT
    COUNT(EVT_CODE), MONTHLY
FROM
(
    SELECT
        R5E.EVT_CODE,
        /*CASE //이것은 필요없을 듯. MSSQL서 COUNT시 NULL은 자동으로 0으로 인식됨
            WHEN R5E.EVT_CODE IS NULL THEN 0
            WHEN R5E.EVT_CODE IS NOT NULL THEN 1
        END AS CODE_COUNT,*/
        CASE
            WHEN R5E.MON IS NULL THEN TM2.MON
            WHEN R5E.MON IS NOT NULL THEN R5E.MON
        END AS MONTHLY
    FROM
    (
        (
            SELECT EVT_CODE, CONVERT(CHAR(7), EVT_DATE, 121) AS MON FROM R5EVENTS
            WHERE CONVERT(CHAR(7), EVT_DATE, 121) BETWEEN '2008-12' AND '2009-01'
        ) R5E
        FULL OUTER JOIN
        (
            SELECT MON, CNT FROM
            (
                SELECT '2009-01' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-02' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-03' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-04' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-05' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-06' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-07' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-08' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-09' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-10' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-11' AS MON, 0 AS CNT FROM DUAL
                UNION ALL
                SELECT '2009-12' AS MON, 0 AS CNT FROM DUAL
            ) TM
        ) TM2
        ON TM2.MON = R5E.MON
    )
) A
GROUP BY
    MONTHLY

길어졌다...