안녕하세요 아래 group by count 관련 질문드렸었던 질문자입니다.. 0 6 928

by 몽환중독자 [SQL Query] [2018.11.27 10:54:12]


아래글에서 마농님이 답글 달아주신 링크보고 쿼리를 작성해보았는데요 제가 지금 사용중인  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

 

by 우리집아찌 [2018.11.27 11:02:34]

PARTITION OUTER JOIN은 아마 오라클만 될듯한데요.

년도와 P_KND_CD를 크로스 조인시켜서 리스트 만든다음에 OUTER JOIN 쓰셔야할것 같아요.


by 마농 [2018.11.27 12:23:19]

티베로면 오리클에서 되는 거 거의 다 되는데요?
PARTITION BY 구문에 코드는 빼야 하구요. 년도만 들어가면 됩니다.
그런데 컬럼명이 년도가 아니라 date 로 되어 있네요?
년도로 뽑으려면 substr 써야 할 것 같네요?
코드 테이블도 해당 코드만 있는게 아닌 공통코드 인듯 하네요?
where 절에 대분류 조건 안줬네요?
원하는 결과표에는 년도와 코드명이 나오는데?
작성하신 쿼리는 일자와 코드로만 되어 있네요?

정확한 정보를 주세요.
1. 공통코드 테이블에는 코드 외에 분류코드와 코드명이 있을 것 같습니다.
2. pblcate_date 항목은 연도가 아닌 것 같습니다.
  - 연도만 추출해서 써야 할 것 같네요.
  - 해당 항목의 자료형에 따라 연도 추출방법이 다릅니다.
3. Partition Outer Join 티베로 가능 여부
  - 원래 되는데 잘못 작성해서 안되는 건지?
  - 원래 안되는 건지?


by 몽환중독자 [2018.11.27 14:05:25]

도움주신 우리집아찌님 마농님 두분 모두 감사합니다...

그런데 티베로에서는  파티셔 구문이 셀렉트절에서는 먹히는데 조건절에서는 안먹히는것 같습니다..아무리해봐도 에러네요 ㅠㅠ

그래서 우리집아찌님께서 말씀하신대로 크로스조인해서 테이블을 생성하고 다시 아웃조인하는 방식으로 해서 제가 원하는 결과를 도출할수 있었습니다..

관심가져주셔서 감사드립니다..^^

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;
전 이렇게 했는데 혹시 이보다 더 간결하게 할수 있는 방법이 있을까요?

지나가시는 고수분들 보시면 가르침을 주시면 감사하겠습니다..^^

 


by 마농 [2018.11.27 14:41:19]

Partition 구문이 Select 에서는 되는데 Where 절에서는 안된다? 표현이 좀 이상합니다.
파티션 단독으로 구문이라고 하기엔 무리가 있습니다. 다른 구문의 일부라고 봐야죠.


by 마농 [2018.11.27 14:35:24]
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

 


by 몽환중독자 [2018.11.27 17:51:46]

오 감사합니다.. 제가 했던것보다 훨씬 간결하고 좋네요...^^

매번 친철한 답변에 감사드립니다. 마농님^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입