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가 더 증가하는 신기한 현상이...
왜 그럴까요 ㅠㅠ
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 ;