9일차

|
/* 0814 실습 - 다음의 SQL을 작성하시오
1. 상품주문에서 주문번호, 제품번호, (제품제조국가위치)를 추출하시오
-(제품제조국가위치): 제품번호의 마지막 2자리가 01이면 ‘국내’, 아니면 ‘해외’
-조건: 총가격(항목수량*항목가격)이 500$이상인 주문 */
select order_num, prod_id, DECODE(SUBSTR(TRIM(prod_id), -2), '01', '국내', '해외') as prod_nation_location
from orderitems
WHERE order_num IN (
         SELECT order_num
         FROM   orderitems
         GROUP BY order_num
         HAVING SUM(quantity*item_price) >= 500
      )
; 

/* 2. 주문과 고객정보를 조인하여 다음의 결과를 추출하시오
-결과: 주문번호, 주문날자, 제품번호, 고객번호, 고객이름, 고객주소, 고객시, 고객메일주소
-조건: 전체주문에서 가장 많은 상품종류를 판매한 공급업체에서 만든 제품만조회*/
select OI.order_num, O.order_date, P.prod_id, C.cust_id, C.cust_name, C.cust_address, C.cust_city, C.cust_email
from orderitems OI, orders O, customers C, products P
where OI.order_num = O.order_num
AND O.cust_id = C.cust_id
AND OI.prod_id = P.prod_id
AND EXISTS(
    SELECT MAX(COUNT(DISTINCT prod_id))
    FROM Products
    GROUP BY vend_id
    )
;

-- 강사님 풀이
SELECT a.order_num, a.order_date, b.prod_id, a.cust_id, c.cust_name, c.cust_address, c.cust_city, c.cust_email
FROM   orders a, orderitems b, customers c
WHERE  a.order_num = b.order_num
AND    a.cust_id = c.cust_id
AND    b.prod_id IN (
         SELECT prod_id
         FROM   products
         WHERE  vend_id IN (
                SELECT vend_id
                FROM
                (
                    SELECT b.vend_id, COUNT(a.prod_id) AS prod_cnt
                    FROM   orderitems a, products b
                    WHERE  a.prod_id = b.prod_id
                    GROUP BY b.vend_id
                ) m
                WHERE prod_cnt = (
                    SELECT MAX(COUNT(a.prod_id)) AS prod_cnt
                    FROM   orderitems a, products b
                    WHERE  a.prod_id = b.prod_id
                    GROUP BY b.vend_id
                )         
              )
       )
;    

-- 왈답
select ord.order_num, ord.order_date, ori.prod_id, ct.cust_id, ct.cust_name, ct.cust_address, ct.cust_city, ct.cust_email
from orders ord, orderitems ori, customers ct
where ord.order_num = ori.order_num
AND  ord.cust_id = ct.cust_id
and ori.prod_id in (
	select pd_m.prod_id
	from products pd_m
	where pd_m.vend_id in (		
            select temp.vend_id 
            from( 
                select temp3.vend_id, rank() over(order by temp3.vend_cnt desc) as vend_rank, temp3.vend_cnt
                from (
                    select pd1.vend_id, sum(temp2.cnt) as vend_cnt 
                    from(
                        select oi.prod_id,  count(oi.order_num) as cnt 
                        From orderitems oi
                        group by oi.prod_id
                        
                    ) temp2
                    , products pd1
                    where temp2.prod_id = pd1.prod_id 
                    group by pd1.vend_id
                ) temp3
            ) temp 
            where temp.vend_rank = 1
	)
); 

/* 3. 주문 중에 고객이 사는 도시가 ‘Detroit’이고 주문한 총 제품의 수가 500을 넘는 고객을 추출하시오
-결과: 고객번호, 고객이름, 고객도시 */
SELECT C.cust_id, C.cust_name, C.cust_city
from customers C 
WHERE cust_city LIKE '%Detroit%'
AND EXISTS(
    SELECT *
    FROM Orderitems OI, Orders O
    WHERE C.cust_id = O.cust_id
    AND O.order_num = OI.order_num
    HAVING SUM(OI.quantity) > 500
    )
;

/* 4. 모든 주문에 대해 다음의 결과를 추출하시오
-결과: 주문번호, 주문날자(YYYY-MM-DD), 고객번호, 고객이름, 주문제품번호, 주문제품이름, 공급업체번호, 공급업체명
-조건: 3$대의 제품을 판매하는 공급업체의 모든 주문*/
SELECT O.order_num, TO_CHAR(O.order_date, 'YYYY-MM-DD'), C.cust_id, TRIM(C.cust_name), P.prod_id, TRIM(P.prod_name), V.vend_id, V.vend_name
FROM Orders O, Customers C, Products P, Vendors V, orderitems OI
WHERE O.order_num = OI.order_num
AND OI.prod_id = P.prod_id
AND P.vend_id = V.vend_id
AND O.cust_id = C.cust_id
AND TRUNC(prod_price) = 3;

-- 조인 3개 이하로 줄인 것.
SELECT O.order_num, TO_CHAR(O.order_date, 'YYYY-MM-DD'), C.cust_id, TRIM(C.cust_name), K.prod_id, TRIM(K.prod_name), K.vend_id, K.vend_name
FROM Orders O, Customers C, 
    (SELECT OI.order_num, P.prod_id, P.prod_name, V.vend_id, V.vend_name, P.prod_price
    FROM Orderitems OI, Products P, Vendors V
    WHERE OI.prod_id = P.prod_id
    AND P.vend_id = V.vend_id) K -- from 절에 이렇게 하면 속도가 느려질수 있음.
WHERE O.cust_id = C.cust_id
AND K.order_num = O.order_num
AND TRUNC(K.prod_price) = 3;

-- 5. 주문날자가 2004년도에 발생한 주문 중에 주문상품의 항목가격이 90$를 넘는 항목가격에 대해 10%씩을 DC하여 변경하시오
UPDATE Orderitems
SET item_price = item_price * 0.9
WHERE EXISTS
    (SELECT O.order_date
    FROM Orders O
    WHERE TO_CHAR(O.order_date, 'YYYY') LIKE '%2004%'
    AND item_price >= 90
    )
;

'Bitcamp > BITCAMP - SQL' 카테고리의 다른 글

10일차  (0) 2019.08.27
8일차  (0) 2019.08.12
7일차  (0) 2019.08.02
6일차  (0) 2019.07.31
5일차  (0) 2019.07.30
And