728x90
반응형

문제


https://school.programmers.co.kr/learn/courses/30/lessons/157339

 

정답


-- 코드를 입력하세요
SELECT AA.CAR_ID, BB.CAR_TYPE, BB.FEE FROM
(
    SELECT 
        B.CAR_ID CAR_ID, 
        MAX(START_DATE) START_DATE2,
        MAX(END_DATE) END_DATE2
    FROM 
        CAR_RENTAL_COMPANY_CAR A, 
        CAR_RENTAL_COMPANY_RENTAL_HISTORY B
    WHERE 1=1
        AND A.CAR_ID = B.CAR_ID
    GROUP BY B.CAR_ID
) AA
,(
    SELECT 
        A.CAR_ID AS CAR_ID
        ,A.CAR_TYPE AS CAR_TYPE
        ,(A.DAILY_FEE * (1-B.DISCOUNT_RATE*0.01) * 30) AS FEE
    FROM CAR_RENTAL_COMPANY_CAR A, CAR_RENTAL_COMPANY_DISCOUNT_PLAN B
    WHERE 1=1
        AND A.CAR_TYPE = B.CAR_TYPE
        AND A.CAR_TYPE IN ('세단', 'SUV')
        AND B.DURATION_TYPE = '30일 이상'
) BB
WHERE 1=1
    AND AA.CAR_ID = BB.CAR_ID
    AND ( AA.START_DATE2 > TO_DATE('20221130', 'YYYYMMDD') 
         OR AA.END_DATE2 < TO_DATE('20221101', 'YYYYMMDD') )
    AND BB.FEE >= 500000 AND BB.FEE < 2000000
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC
;

 

결과


 

CAR_ID CAR_TYPE FEE
3 세단 1518000
23 세단 1380000

 

풀이


아래 두 테이블을 JOIN하면 되는 문제이다.

 

1.  2022년 11월 1일부터 2022년 11월 30일까지 대여 가능한 차동차 구하기

SELECT * FROM
(
    SELECT 
        B.CAR_ID CAR_ID, 
        MAX(START_DATE) START_DATE2,
        MAX(END_DATE) END_DATE2
    FROM 
        CAR_RENTAL_COMPANY_CAR A, 
        CAR_RENTAL_COMPANY_RENTAL_HISTORY B
    WHERE 1=1
        AND A.CAR_ID = B.CAR_ID
        AND A.CAR_TYPE IN ('세단', 'SUV')
    GROUP BY B.CAR_ID
) AA
WHERE 1=1
    AND ( AA.START_DATE2 > TO_DATE('20221130', 'YYYYMMDD') 
         OR AA.END_DATE2 < TO_DATE('20221101', 'YYYYMMDD') )
;

 

2. 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차 구하기

SELECT * FROM
(
    SELECT 
        A.CAR_ID AS CAR_ID
        ,A.CAR_TYPE AS CAR_TYPE
        ,(A.DAILY_FEE * (1-B.DISCOUNT_RATE*0.01) * 30) AS FEE
    FROM CAR_RENTAL_COMPANY_CAR A, CAR_RENTAL_COMPANY_DISCOUNT_PLAN B
    WHERE 1=1
        AND A.CAR_TYPE = B.CAR_TYPE
        AND A.CAR_TYPE IN ('세단', 'SUV')
        AND B.DURATION_TYPE = '30일 이상'
) BB
WHERE 1=1
    AND BB.FEE >= 500000 AND BB.FEE < 2000000
;
728x90
반응형
728x90
반응형

문제


https://school.programmers.co.kr/learn/courses/30/lessons/133027?language=oracle

 

 

정답


-- 아이스크림 가게의 상반기 주문 정보를 담은 FIRST_HALF
-- 7월의 아이스크림 주문 정보를 담은 JULY
-- (7월 아이스크림 총 주문량 + 상반기의 아이스크림 총 주문량) 
-- 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.
SELECT B.FLAVOR
FROM (
SELECT A.FLAVOR, SUM(A.TOTAL_ORDER) AS TOTAL_ORDER FROM (
SELECT FLAVOR, TOTAL_ORDER FROM FIRST_HALF
    UNION 
SELECT FLAVOR, TOTAL_ORDER FROM JULY  
) A
GROUP BY A.FLAVOR
ORDER BY TOTAL_ORDER DESC) B
WHERE ROWNUM < 4
  • UNION을 하면 중복값 제외, UNION ALL 을 쓰면 중복값 포함이다
  • GROUP BY 된 채로 ORDER BY를 사용할 수 있다!
SELECT A.FLAVOR, SUM(A.TOTAL_ORDER) AS TOTAL_ORDER FROM (
SELECT FLAVOR, TOTAL_ORDER FROM FIRST_HALF
    UNION 
SELECT FLAVOR, TOTAL_ORDER FROM JULY  
) A
GROUP BY A.FLAVOR
ORDER BY TOTAL_ORDER DESC

728x90
반응형
728x90
반응형

SQL처음 공부할 때는 알았으려나...?

그동안 실무를 하면서 너무 UNION ALL 에 익숙해져서 둘의 차이를 잊고 있었다!

  UNION UNION ALL
중복 처리 중복 Row 제외 중복 Row 포함

 

UNION (= UNION DISTINCT)

(SELECT cust_no, lst_lgin_dtm FROM A) 

UNION 

(SELECT cust_no, lst_lgin_dtm FROM B)
CUST_NO    LST_LGIN_DTM
-------------------------------
1111       2022/10/31 10:21:59
1111	   2022/11/21 17:49:34
1111	   2023/04/02 23:51:01
1111	   2023/04/04 09:51:01

두 테이블에서 같은 데이터 row가 2건 이상 나오면 해당 데이터는 1건만 남기고 나머지는 지운다.

 

UNION ALL

(SELECT cust_no, lst_lgin_dtm FROM A) 

UNION ALL

(SELECT cust_no, lst_lgin_dtm FROM B)
CUST_NO    LST_LGIN_DTM
-------------------------------
1111       2022/10/31 10:21:59
1111	   2022/11/21 17:49:34
1111	   2023/04/02 23:51:01
1111	   2023/04/02 23:51:01
1111	   2023/04/02 23:51:01
1111	   2023/04/04 09:51:01

두 테이블에서 같은 데이터 row가 2건 이상 나오면 한 건도 빠짐없이 모두 조회된다.

728x90
반응형

+ Recent posts