robert-min / dev-blog

김민준 - project 정리한 repo입니다.
0 stars 0 forks source link

240818 - SQL(IFNULL, WHERE NOT IN, DATEDIFF, HAVING, WITH(테이블 구분), CASE THEN, COUNT(DISTINCT) #146

Open robert-min opened 2 months ago

robert-min commented 2 months ago

IFNULL : null 값 처리

FOOD_WAREHOUSE 테이블에서 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요

-- 코드를 입력하세요
SELECT
    WAREHOUSE_ID,
    WAREHOUSE_NAME,
    ADDRESS,
    IFNULL(FREEZER_YN, "N") AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE "경기도%"
ORDER BY WAREHOUSE_ID ASC
-- 코드를 입력하세요
SELECT
    WAREHOUSE_ID,
    WAREHOUSE_NAME,
    ADDRESS,
    COALESCE(FREEZER_YN, "N") AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE "경기도%"
ORDER BY WAREHOUSE_ID ASC
robert-min commented 2 months ago

WHERE NOT IN

더 이상 업그레이드할 수 없는 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.

SELECT
    ITEM_ID,
    ITEM_NAME,
    RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (
    SELECT
        DISTINCT(PARENT_ITEM_ID)
    FROM ITEM_TREE
    WHERE PARENT_ITEM_ID IS NOT NULL
)
ORDER BY ITEM_ID DESC
robert-min commented 2 months ago

DATEDIFF

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    A.CAR_ID,
    ROUND(AVG(DIFF), 1) AS AVERAGE_DURATION
FROM (
    SELECT
        CAR_ID,
        -- 날짜 차이는 해당 날짜까지 포함이라 + 1해야 함!!
        DATEDIFF(END_DATE, START_DATE) + 1 AS DIFF
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
) AS A
GROUP BY A.CAR_ID
HAVING ROUND(AVG(DIFF), 1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
robert-min commented 2 months ago

WITH(테이블 구분)

-- 코드를 입력하세요
# SELECT
#     BOARD_ID,
#     CONCAT("/home/grep/src/", BOARD_ID, "/", FILE_ID, FILE_NAME, FILE_EXT)
# FROM USED_GOODS_FILE

WITH pathviews AS (
    SELECT
        PATH,
        SUM(VIEWS) AS TOTAL_VIEW
    FROM (
        SELECT
            FILE_ID,
            BOARD_ID,
            CONCAT("/home/grep/src/", BOARD_ID, "/", FILE_ID, FILE_NAME, FILE_EXT) AS PATH
        FROM USED_GOODS_FILE
    ) AS F
    JOIN USED_GOODS_BOARD AS B
    ON F.BOARD_ID = B.BOARD_ID
    GROUP BY PATH
    ORDER BY F.FILE_ID DESC
),

maxviews AS (
    SELECT
        MAX(TOTAL_VIEW) AS MAX_VIEW
    FROM pathviews
)

SELECT
    PATH
FROM pathviews
WHERE TOTAL_VIEW = (
    SELECT
        MAX(TOTAL_VIEW) AS MAX_VIEW
    FROM pathviews
)
robert-min commented 2 months ago

CASE THEN

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

WITH history AS (
    SELECT
        HISTORY_ID,
        CAR_ID,
        DATEDIFF(END_DATE, START_DATE) + 1 AS DIFF
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
),
fees AS (
    SELECT
        HISTORY_ID,
        C.CAR_TYPE,
        DIFF,
        DIFF * DAILY_FEE AS FEE,
        CASE
        WHEN DIFF >= 90 THEN "90일 이상"
        WHEN DIFF >= 30 THEN "30일 이상"
        WHEN DIFF >= 7 THEN "7일 이상"
        ELSE "NONE"
        END AS DURATION_TYPE
    FROM history AS h
    JOIN CAR_RENTAL_COMPANY_CAR AS C
    ON h.CAR_ID = C.CAR_ID
),
discounts AS (
    SELECT
        HISTORY_ID,
        FEE,
        DISCOUNT_RATE,
        IFNULL((100 - DISCOUNT_RATE) / 100, 1) AS PURCHASE_RATE
    FROM fees AS F
    LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P
    ON F.CAR_TYPE = P.CAR_TYPE
        AND F.DURATION_TYPE = P.DURATION_TYPE
    WHERE F.CAR_TYPE = "트럭"
)

SELECT
    HISTORY_ID,
    FLOOR(FEE * PURCHASE_RATE) AS FEE
FROM discounts
ORDER BY FEE DESC, HISTORY_ID DESC
robert-min commented 2 months ago

COUNT(DISTINCT)

USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

WITH allmembers AS (
    SELECT
        COUNT(DISTINCT(USER_ID)) AS ALL_MEMBERS
    FROM USER_INFO
    WHERE YEAR(JOINED) = "2021"
)

SELECT
    YEAR(SALES_DATE) AS YEAR,
    MONTH(SALES_DATE) AS MONTH,
    COUNT(DISTINCT(S.USER_ID)) AS PURCHASED_USERS,
    ROUND(COUNT(DISTINCT(S.USER_ID)) / (SELECT ALL_MEMBERS FROM allmembers), 1) AS PUCHASED_RATIO
FROM ONLINE_SALE AS S
JOIN USER_INFO AS I
ON S.USER_ID = I.USER_ID
WHERE YEAR(JOINED) = "2021"
GROUP BY YEAR, MONTH
ORDER BY YEAR ASC, MONTH ASC