아래글에서 마농님이 답글 달아주신 링크보고 쿼리를 작성해보았는데요 제가 지금 사용중인 DBMS가 티베로인데
티베로에서는
SELECT T.PBLCATE_DATE, T.PBLICTN_KND_CD, count(T.PBLICTN_KND_CD) as cnt
FROM TCOM_COMN_CD_DTL A
LEFT OUTER JOIN TB_PULICTN_ADM T
-- PARTITION BY (T.PBLCATE_DATE, T.PBLICTN_KND_CD)
ON A.CODE = T.PBLICTN_KND_CD
GROUP BY T.PBLCATE_DATE, T.PBLICTN_KND_CD;
이렇게 작성을하니 주석처리한 부분에서 , missing키워드 에러가 나면서 실행이 안되더라구요
저부분을 주석처리하고 나면 실행이 되긴하는데요..원하는 형태대로 데이터가 출력이 되질 않고요
그래서 아래와같이
select T.PBLCATE_DATE, T.PBLICTN_KND_CD, count(T.PBLICTN_KND_CD) as cnt
from TCOM_COMN_CD_DTL A, TB_PULICTN_ADM T
where A.CLASS='PTN001'
and A.CODE = T.PBLICTN_KND_CD(+)
group by T.PBLCATE_DATE, T.PBLICTN_KND_CD;
이렇게 작성을 했더니 역시 원하는 결과대로가 아니라 건수가 없는 종류는 출력이 되지 않고 2017년도는 데이타가 존재하는 메뉴얼에 대하서만 출력이 되네요
아직 초보라서 잘 응용이 안되네요 ㅜㅜ
고수님들에 도움 부탁드립니다..
아래와 같은 결과를 원하는데 잘 안되네요
P_YEAR | P_KND_CD | CNT |
2017 | 정책연구 | 0 |
2017 | 메뉴얼 | 3 |
2017 | 교육책자 | 0 |
2017 | 홍보책자 | 0 |
2017 | 기타 | 0 |
2018 | 정책연구 | 5 |
2018 | 메뉴얼 | 4 |
2018 | 교육책자 | 4 |
2018 | 홍보책자 | 2 |
2018 | 기타 | 1 |
티베로면 오리클에서 되는 거 거의 다 되는데요?
PARTITION BY 구문에 코드는 빼야 하구요. 년도만 들어가면 됩니다.
그런데 컬럼명이 년도가 아니라 date 로 되어 있네요?
년도로 뽑으려면 substr 써야 할 것 같네요?
코드 테이블도 해당 코드만 있는게 아닌 공통코드 인듯 하네요?
where 절에 대분류 조건 안줬네요?
원하는 결과표에는 년도와 코드명이 나오는데?
작성하신 쿼리는 일자와 코드로만 되어 있네요?
정확한 정보를 주세요.
1. 공통코드 테이블에는 코드 외에 분류코드와 코드명이 있을 것 같습니다.
2. pblcate_date 항목은 연도가 아닌 것 같습니다.
- 연도만 추출해서 써야 할 것 같네요.
- 해당 항목의 자료형에 따라 연도 추출방법이 다릅니다.
3. Partition Outer Join 티베로 가능 여부
- 원래 되는데 잘못 작성해서 안되는 건지?
- 원래 안되는 건지?
도움주신 우리집아찌님 마농님 두분 모두 감사합니다...
그런데 티베로에서는 파티셔 구문이 셀렉트절에서는 먹히는데 조건절에서는 안먹히는것 같습니다..아무리해봐도 에러네요 ㅠㅠ
그래서 우리집아찌님께서 말씀하신대로 크로스조인해서 테이블을 생성하고 다시 아웃조인하는 방식으로 해서 제가 원하는 결과를 도출할수 있었습니다..
관심가져주셔서 감사드립니다..^^
select z.PBLCATE_DATE, z.code, (select code_name from TCOM_COMN_CD_DTL where class = 'PTN001' and z.code = code) as PBLICTN_KND_CD_NM, count(k.PBLICTN_KND_CD) as cnt
from
(
select T.PBLCATE_DATE, T.code
from
(
select b.PBLCATE_DATE, b.PBLICTN_KND_CD, a.code
from TCOM_COMN_CD_DTL a, TB_PULICTN_ADM b
where a.class = 'PTN001'
order by b.PBLCATE_DATE) T
group by T.PBLCATE_DATE, T.CODE
) Z,
TB_PULICTN_ADM K
where z.PBLCATE_DATE = k.PBLCATE_DATE(+)
and Z.code = k.PBLICTN_KND_CD(+)
group by z.PBLCATE_DATE, z.code
order by z.PBLCATE_DATE, z.code;
전 이렇게 했는데 혹시 이보다 더 간결하게 할수 있는 방법이 있을까요?
지나가시는 고수분들 보시면 가르침을 주시면 감사하겠습니다..^^
SELECT a.pblcate_date , b.code pblictn_knd_cd , b.code_name pblictn_knd_cd_nm , COUNT(c.pblictn_knd_cd) cnt FROM (SELECT DISTINCT pblcate_date FROM tb_pulictn_adm) a CROSS JOIN (SELECT code, code_name FROM tcom_comn_cd_dtl WHERE class = 'PTN001') b LEFT OUTER JOIN tb_pulictn_adm c ON c.pblcate_date = a.pblcate_date AND c.pblictn_knd_cd = b.code GROUP BY a.pblcate_date, b.code, b.code_name ORDER BY a.pblcate_date, b.code ; http://gurubee.net/lecture/2190