오라클 between 관련 질문입니다 0 2 571

by 천만달러 [Oracle 기초] [2021.05.28 16:24:58]


쿼리1.png (25,737Bytes)
쿼리2.png (29,927Bytes)

select *
from (
    SELECT A.item_name
        , SUM(B.amount) as amount
    FROM burger_item A
    LEFT OUTER JOIN burger_ord_item B
    ON A.item_code = B.item_code
    GROUP BY A.item_name, A.item_code
    ORDER BY amount DESC
)
where rownum <= 3;

 

이 쿼리에서 탑3개를 뽑았는데

기간을까지 폼함해서 그 기간에 탑3를 뽑으려고 해서

새로운 테이블 조인해서 해보려고 했는데 잘 안되네요 ㅠㅠ

 

select *
from (
    SELECT a.item_name
        , SUM(b.amount) as amount
    FROM burger_ord_item b
    LEFT OUTER JOIN burger_item a
    ON a.item_code = b.item_code
    LEFT OUTER JOIN burger_ord c
    ON b.store_code = c.store_code
    where c.ord_date between 20180301 and 20180331
    GROUP BY A.item_name
    ORDER BY amount DESC
)
where rownum <= 3;

 

기간을 한정했는데 amount가 더 증가하는 신기한 현상이...

왜 그럴까요 ㅠㅠ

by 마농 [2021.05.28 16:48:11]

1. 조인 조건이 정확하게 주어지지 않으면 데이터가 뻥튀기 됩니다.
- 주문과 주문품목을 조인하는 듯 한데 조인키는 주문번호가 되어야 합니다.
- 그런데 매장코드로 조인하고 있네요?
2. OUTER JOIN 을 하고 있는데?
- 잘 모르고 습관적으로 사용하는 듯 합니다.
- 여기서는 OUTER JOIN 을 사용할 이유가 없어 보입니다.
- INNER JOIN 이 맞는 듯 합니다.
3. 정렬 기준은
- 금액만으로는 중복이 가능하니
- 유니크한 다른 항목을 추가로 정렬하세요.

SELECT *
  FROM (SELECT a.item_name
             , SUM(b.amount) amount
          FROM burger_item a
         INNER JOIN burger_ord_item b
            ON a.item_code = b.item_code
         INNER JOIN burger_ord c
            ON b.ord_no = c.ord_no
         WHERE c.ord_date BETWEEN '20180301' AND '20180331'
         GROUP BY a.item_name
         ORDER BY amount DESC, item_name
        )
 WHERE ROWNUM <= 3
;

 


by 천만달러 [2021.05.28 17:17:15]

와우...진짜 대박...1번만 달렸을때 해결했습니다 감사합니다

조인방법이 많은데 차이를 알고 사용해야겠네요 감사합니다!!!

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