Q&A

  • 쿼리문좀 봐주세여..어흑...
select p.proType, p.proCode, p.proStatus, p.proPFrom, p.proPTo,
       nvl(q.bRt, 0) pRt, nvl(r.cRt, 0) aRt
  from pro_mst p
  left outer join (select proCode, sum(mrtPRate) bRt
                     from pro_mrt
                    where mrtYMD <= '200506'
                    group by proCode) q on p.proCode = q.proCode
  left outer join (select proCode, sum(mrtARate) cRt
                     from pro_amrt
                    where mrtYMD <= '200506'
                    group by proCode) r on p.proCode = r.proCode

==>결과
PROTYPE  PROCODE         PROSTATUS PROPFROM  PROPTO    PRT ART
  3       PRO200505060001 1         20050101  20071201  27  5
  1       PRO200505230002 1         20050502  20050530  0   0


select x.proType, nvl(count(x.proCode), 0)  bCnt
  from (select p.proType, p.proCode, p.proStatus, p.proPFrom, p.proPTo,
               nvl(q.bRt, 0) pRt, nvl(r.cRt, 0) aRt
          from pro_mst p
          left outer join (select proCode, sum(mrtPRate) bRt
                             from pro_mrt
                            where mrtYMD <= '200506'
                            group by proCode) q on p.proCode = q.proCode
          left outer join (select proCode, sum(mrtARate) cRt
                             from pro_amrt
                            where mrtYMD <= '200506'
                            group by proCode) r on p.proCode = r.proCode
        ) x
where x.proStatus = '1'
   and x.pRt <= x.aRt
group by x.proType

==> 결과

PROTYPE  BCNT
  1       1

select a.pType, a.proTypeName, nvl(a.aCnt, 0) aCnt, nvl(b.bCnt, 0) bCnt
  from (select '1' pType, '연구' proTypeName, nvl(count(proCode), 0) aCnt
          from pro_mst
         where proType = '1'
         union
        select '2' pType, '개발' proTypeName, nvl(count(proCode), 0) aCnt
          from pro_mst
         where proType = '2'
        union
        select '3' pType, '상용화' proTypeName, nvl(count(proCode), 0) aCnt
          from pro_mst
         where proType = '3') a
  left outer join
       (select x.proType, nvl(count(x.proCode), 0)  bCnt
          from (select p.proType, p.proCode, p.proStatus, nvl(q.bRt, 0.00) pRt, nvl(r.cRt, 0.00) aRt
                  from pro_mst p
                  left outer join (select proCode, sum(mrtPRate) bRt
                                     from pro_mrt
                                    where mrtYMD <= '200506'
                                    group by proCode) q on p.proCode = q.proCode
                  left outer join (select proCode, sum(mrtARate) cRt
                                     from pro_amrt
                                    where mrtYMD <= '200506'
                                    group by proCode) r on p.proCode = r.proCode
                ) x
         where x.proStatus = '1'
           and x.pRt <= x.aRt
         group by x.proType ) b on a.pType = b.proType

==> 결과

PTYPE PROTYPENAME ACNT  BCNT
1     연구        2     1
3     상용화      1     1
2     개발        0     0

이런 결과가 나옵니다
위 쿼리문을 보시면 아시겠지만
and x.pRt <= x.aRt <-- 이 조건때문애 상용화의 BCNT에는 값이 들어가면 안되는데 값이 나옵니다
왜그럴까요?
4  COMMENTS
  • Profile
    nilriri™ 2005.06.04 18:39

    한쪽테이블을 기준으로 모두 나오는거 아닌가요?

    그리고 아래쪽에 union을 쓰셨는데...

    decode나 case when 문장과 조건절에 in연산자를 쓰셔서 하시는게 더 낳을듯 싶습니다.

    그리고 중복레코드를 제거할 필요가 없다면 union 보다는 union all이 더 좋지않나요?

    그럼..

  • Profile
    성더기 2005.06.08 01:20
    쿼리문을 보시면 아시겠지만
    and x.pRt <= x.aRt  요넘은 조인 조건이 아닙니다, 쿼리조건이지요
    조인 조건은 on a.pType = b.proType 입니다
    이런경우 그냥 inner join을 하면 b.proType 과 a.pType이 같은 넘이 없을경우 a 테이블의 레코드가 전부
    안나타나죠. 그걸 막기위해 left outer join을 했습니다
    즉 두번째 쿼리를 보시면 분명히 한개의 레코드만 보입니다. 쿼리조건이 먹는 거지요
    이넘의 조인을 하면 쿼리조건이 안먹는다는 거였습니다

    union을 사용한 이유는 a.proType이라는 필드의 값이 3인경우가 없어도 해당 레코드가 1개는 나와야 하기
    때문에 union을 사용하여 작업하였습니다
    중복레코드는 나올일이 없습니다..^^

  • Profile
    nilriri™ 2005.06.09 02:05
    보시면 아시겠지만...

    색깔별로 나눠진 부분(노랑, 녹색, 보라, 빨강)을 각각 쿼리해 보시구요.

    빨간 부분에 인라인뷰로 되어진 부분을..

    left outer join을 하셨는데..

    이것때문에..결과가 3개가 모두 나오고 있는거 아닌가요?

    마지막부분의 b on a.pType = b.proType 이 조건에 안 맞더라도..

    한쪽을 기준으로 모두 나오도록 하는것이지요..  --;  

    제가 자꾸 엉뚱한 소리만 하는건 아니겠죠? ^^;

    그럼..
  • Profile
    성더기 2005.06.15 19:42
    먼저 초록색부분을 실행하면
    proType proCode .... pRt aRt
    1            xxx              3      1
    3            bbb             0       0
    이런 레코드가 2개생깁니다

    그다음 보라색부분을 실행하면 레코드는
    proType bCnt
    3             1

    이되죠...

    여기서
    전체 쿼리를 실행하면
    pType proTypeName aCnt bCnt
    1         연구                 1      1
    3         상용화              1      1
    2         개발                 1      0

    으로나옵니다
    여기서 문제가 생깁니다
    위 보라색부분을 실행한 쿼리결과는 proType이 3인넘 하나 밖에 없는데
    그넘을 a.pType = b.proType 의 조건으로 left outer join을 했는데..
    pType이 1인넘의 bCnt가 왜 나오냐는 거지요
    노란색쿼리부분에는 bCnt가 없습니다..