지난 글에 프로그래머스 SQL 고득점 KIT 공부했던 내용 이어 정리 ..!
1에서 정리한 내용은 제일 기본 중 기본의 내용이고, 지금 정리하는 부분부터가 조금 더 난이도가 있는 내용이다. (실제로 봤던 SQL테스트에도 JOIN, GROUP BY, DATE를 다 사용해야 하는 내용들이 많이 출제되었다.)
SELECT (CASE WHEN PRICE < 10000 THEN 0
ELSE TRUNCATE (PRICE, -4)
END) as PRICE_GROUP
, COUNT(PRODUCT_ID) as PRODUCTS
FROM PRODUCT
GROUP BY 1
ORDER BY 1
SELECT MCDP_CD as '진료과코드'
, COUNT(PT_NO) as '5월예약건수'
FROM APPOINTMENT
WHERE MONTH(APNT_YMD) = '05' # DATE_FORMAT(APNT_YMD, '%Y-%m') = '2022-05'
GROUP BY MCDP_CD
ORDER BY 2, 1
SELECT INGREDIENT_TYPE, SUM(TOTAL_ORDER) as TOTAL_ORDER
FROM FIRST_HALF F
LEFT JOIN ICECREAM_INFO I
on F.FLAVOR = I.FLAVOR
GROUP BY 1
ORDER BY 2
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) as COUNT
FROM ANIMAL_INS
GROUP BY 1
ORDER BY 1
SELECT HOUR(DATETIME) as HOUR
, COUNT(ANIMAL_ID) as COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) < 20
GROUP BY 1
ORDER BY 1
SELECT NAME, COUNT(NAME) as COUNT
FROM ANIMAL_INS
GROUP BY 1
HAVING COUNT(NAME) > 1
ORDER BY 1
SELECT CAR_TYPE, COUNT(CAR_ID) as CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP '시트'
# WHERE OPTIONS LIKE '%시트%'
# WHERE OPTIONS REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY 1
ORDER BY 1
REGEXP '가|나|다|라': 컬럼에 '가' 또는 '나' 또는 '다' 를 포함한 레코드 모두 출력
(= where column like '%가%' or column like '%나%' or column like '%다%')
REGEXP '가': 컬럼에 '가'를 포함한 모든 레코드 출력
(= where column like '%가%')
SELECT CATEGORY, SUM(SALES) as TOTAL_SALES
FROM BOOK B
LEFT JOIN BOOK_SALES BS
on B.BOOK_ID = BS.BOOK_ID
WHERE DATE_FORMAT(SALES_DATE, "%Y-%m") LIKE '2022-01'
GROUP BY 1
ORDER BY 1
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM (SELECT *, RANK () OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS RK
FROM REST_INFO) AS R
WHERE R.RK = 1
ORDER BY 1 DESC
SELECT MONTH(START_DATE) as MONTH, CAR_ID, COUNT(HISTORY_ID) as RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) BETWEEN 8 and 10
GROUP BY 1
HAVING COUNT(HISTORY_ID) >= 5)
AND MONTH(START_DATE) BETWEEN 8 and 10
GROUP BY 1, 2
ORDER BY 1, 2 DESC
SELECT CATEGORY, PRICE as MAX_PRICE, PRODUCT_NAME
FROM (SELECT *, RANK () OVER (PARTITION BY CATEGORY ORDER BY PRICE DESC) AS RK
FROM FOOD_PRODUCT) R
WHERE CATEGORY IN ('과자','국','김치','식용유')
AND RK = 1
ORDER BY 2 DESC
SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
AND PRICE IN (SELECT MAX(PRICE) FROM FOOD_PRODUCT GROUP BY CATEGORY)
ORDER BY 2 DESC
SELECT YEAR(SALES_DATE) as YEAR, MONTH(SALES_DATE) as MONTH, GENDER, COUNT(DISTINCT OS.USER_ID) as USERS
FROM ONLINE_SALE OS
LEFT JOIN USER_INFO UI
on UI.USER_ID = OS.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3
SELECT AUTHOR_ID, AUTHOR_NAME, CATEGORY, SUM(TOTAL_SALES) AS TOTAL_SALES
FROM (SELECT B.BOOK_ID, CATEGORY, B.AUTHOR_ID, AUTHOR_NAME, (PRICE*SALES) AS TOTAL_SALES
FROM BOOK B
JOIN AUTHOR A
on A.AUTHOR_ID = B.AUTHOR_ID
JOIN BOOK_SALES BS
on B.BOOK_ID = BS.BOOK_ID
WHERE MONTH(SALES_DATE) = 1
) BOOK_TBL
GROUP BY 1, 2, 3
ORDER BY 1, 3 DESC
WITH TBL as (
SELECT AUTHOR_ID, AUTHOR_NAME, CATEGORY, (SALES*PRICE) as TOTAL_SALES
FROM BOOK_SALES BS
LEFT JOIN (SELECT BOOK_ID, CATEGORY, A.AUTHOR_ID, AUTHOR_NAME, PRICE
FROM BOOK B
LEFT JOIN AUTHOR A
on B.AUTHOR_ID = A.AUTHOR_ID) BA
on BS.BOOK_ID = BA.BOOK_ID
WHERE MONTH(SALES_DATE) = 1
)
SELECT AUTHOR_ID, AUTHOR_NAME, CATEGORY, SUM(TOTAL_SALES) AS TOTAL_SALES
FROM TBL
GROUP BY 1, 2, 3
ORDER BY 1, 3 DESC
SET @HOUR = -1;
WITH TIME_TBL as (
SELECT (@HOUR := @HOUR +1) as HOUR
FROM ANIMAL_OUTS
WHERE @HOUR < 23
)
SELECT TT.HOUR, IFNULL(COUNT, 0) as COUNT
FROM TIME_TBL TT
LEFT JOIN (SELECT HOUR(DATETIME) as HOUR, COUNT(ANIMAL_ID) as COUNT
FROM ANIMAL_OUTS
GROUP BY 1
ORDER BY 1) AO
ON TT.HOUR = AO.HOUR
WITH RECURSIVE HOUR as (
SELECT 0 as HOUR
UNION ALL
SELECT HOUR+1 FROM HOUR WHERE HOUR<23
)
SELECT HOUR, COUNT(ANIMAL_ID) as COUNT
FROM HOUR H
LEFT JOIN ANIMAL_OUTS AO
on H.HOUR = HOUR(AO.DATETIME)
GROUP BY 1
WITH RECURSIVE table as(
SELECT 초기값 as column1
UNION ALL
SELECT column1의 계산식 FROM table WHERE 제어문
)
SELECT PRODUCT_CODE, (PRICE*SUM(SALES_AMOUNT)) AS SALES
FROM PRODUCT P
INNER JOIN OFFLINE_SALE O
on P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY 1
ORDER BY 2 DESC, 1
SELECT BOOK_ID, AUTHOR_NAME, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK B
LEFT JOIN AUTHOR A
on A.AUTHOR_ID = B.AUTHOR_ID
WHERE CATEGORY = '경제'
ORDER BY 3
SELECT AO.ANIMAL_ID, AO.NAME
FROM ANIMAL_OUTS AO
LEFT JOIN ANIMAL_INS AI
on AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE INTAKE_CONDITION IS NULL
ORDER BY 1, 2
SELECT AI.NAME, AI.DATETIME
FROM ANIMAL_INS AI
LEFT JOIN ANIMAL_OUTS AO
on AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE AO.DATETIME IS NULL
ORDER BY 2
LIMIT 3
SELECT AI.ANIMAL_ID, AI.NAME
FROM ANIMAL_INS AI
LEFT JOIN ANIMAL_OUTS AO
on AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE AI.DATETIME > AO.DATETIME
ORDER BY AI.DATETIME
SELECT AI.ANIMAL_ID, AI.ANIMAL_TYPE, AI.NAME
FROM ANIMAL_INS AI
LEFT JOIN ANIMAL_OUTS AO
ON AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE AI.SEX_UPON_INTAKE != AO.SEX_UPON_OUTCOME
SELECT FH.FLAVOR
FROM FIRST_HALF FH
LEFT JOIN JULY J
on J.FLAVOR = FH.FLAVOR
GROUP BY 1
ORDER BY FH.TOTAL_ORDER + SUM(J.TOTAL_ORDER) DESC
LIMIT 3
WITH MEMBER_COUNT as(
SELECT M.MEMBER_ID, MEMBER_NAME, COUNT(REVIEW_ID) as REVIEW_COUNT
FROM MEMBER_PROFILE M
LEFT JOIN REST_REVIEW R
on R.MEMBER_ID = M.MEMBER_ID
GROUP BY 1, 2
ORDER BY 3 DESC
)
SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, '%Y-%m-%d') as REVIEW_DATE
FROM REST_REVIEW R
LEFT JOIN MEMBER_COUNT M
on M.MEMBER_ID = R.MEMBER_ID
WHERE REVIEW_COUNT = (SELECT MAX(REVIEW_COUNT) FROM MEMBER_COUNT)
ORDER BY 3, 1
SELECT FP.PRODUCT_ID, PRODUCT_NAME, PRICE*SUM(AMOUNT) as TOTAL_SALES
FROM FOOD_ORDER FO
INNER JOIN FOOD_PRODUCT FP
on FP.PRODUCT_ID = FO.PRODUCT_ID
WHERE DATE_FORMAT(PRODUCE_DATE, '%Y-%m') = '2022-05'
GROUP BY 1, 2
ORDER BY 3 DESC, 1
WITH UI as(
SELECT USER_ID
FROM USER_INFO UI
WHERE YEAR(JOINED) = '2021'
)
SELECT YEAR(SALES_DATE) as YEAR
, MONTH(SALES_DATE) as MONTH
, COUNT(DISTINCT OS.USER_ID) as PUCHASED_USERS
, ROUND(COUNT(DISTINCT OS.USER_ID)/(SELECT COUNT(USER_ID) FROM UI), 1) as PUCHASED_RATIO
FROM UI
INNER JOIN ONLINE_SALE OS
on OS.USER_ID = UI.USER_ID
GROUP BY 1, 2
ORDER BY 1, 2
SELECT HISTORY_ID
, CAR_ID
, DATE_FORMAT(START_DATE, '%Y-%m-%d') START_DATE
, DATE_FORMAT(END_DATE, '%Y-%m-%d') END_DATE
, (CASE WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '장기 대여'
ELSE '단기 대여'
END) as RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') = '2022-09'
ORDER BY 1 DESC
SELECT SUBSTR(PRODUCT_CODE, 1, 2) as CATEGORY, COUNT(PRODUCT_ID)
FROM PRODUCT
GROUP BY 1
ORDER BY 1
SUBSTR(문자열, 시작 위치값): 시작 위치값 숫자 (5라면 5번째) 문자열부터 읽으라는 뜻
SUBSTR(원본 문자열,시작 위치값,가져올 길이값): 시작 위치값 숫자 (5라면 5번째) 문자열부터 읽고, 가져올 길이값 (3이라면 3글자를) 가져오라는 뜻
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') as '날짜'
FROM ANIMAL_INS
ORDER BY 1
SELECT ANIMAL_ID
, NAME
, (CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' or SEX_UPON_INTAKE LIKE '%Spayed%' THEN 'O'
ELSE 'X' END) as '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
CASE
WHEN 조건1 THEN 결과값1
WHEN 조건2 THEN 결과값2
ELSE 결과값3
END
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%EL%' AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
SELECT ORDER_ID
, PRODUCT_ID
, DATE_FORMAT(OUT_DATE, '%Y-%m-%d') as OUT_DATE
, (CASE WHEN DATE_FORMAT(OUT_DATE, '%Y-%m-%d') <= '2022-05-01' then '출고완료'
WHEN OUT_DATE IS NULL THEN '출고미정'
ELSE '출고대기' END) as '출고여부'
FROM FOOD_ORDER
ORDER BY 1
SELECT AI.ANIMAL_ID, AI.NAME
FROM ANIMAL_OUTS AO
INNER JOIN ANIMAL_INS AI
on AI.ANIMAL_ID = AO.ANIMAL_ID
ORDER BY DATEDIFF(AO.DATETIME, AI.DATETIME) DESC
LIMIT 2
SELECT APNT_NO, PT_NAME, A.PT_NO, A.MCDP_CD, DR_NAME, APNT_YMD
FROM APPOINTMENT A
LEFT JOIN PATIENT P
on P.PT_NO = A.PT_NO
LEFT JOIN DOCTOR D
on D.DR_ID = A.MDDR_ID
WHERE APNT_CNCL_YN = 'N'
and DATE_FORMAT(APNT_YMD, '%Y-%m-%d') = '2022-04-13'
and A.MCDP_CD = 'CS'
ORDER BY 6
WITH CAR_HISTORY as (
SELECT HISTORY_ID
, CH.CAR_ID
, DATEDIFF(END_DATE, START_DATE)+1 as DURATION
, DAILY_FEE
, (CASE WHEN DATEDIFF(END_DATE, START_DATE)+1 >= 7 AND DATEDIFF(END_DATE, START_DATE)+1 <30 THEN '7일 이상'
WHEN DATEDIFF(END_DATE, START_DATE)+1 >= 30 AND DATEDIFF(END_DATE, START_DATE)+1 <90 THEN '30일 이상'
WHEN DATEDIFF(END_DATE, START_DATE)+1 >=90 THEN '90일 이상'
ELSE '7일 미만' END) as DURATION_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY CH
LEFT JOIN CAR_RENTAL_COMPANY_CAR CC
on CH.CAR_ID = CC.CAR_ID
WHERE CAR_TYPE = '트럭'
)
SELECT HISTORY_ID
, (CASE WHEN CH.DURATION_TYPE = '7일 미만' THEN DAILY_FEE*DURATION
ELSE CAST((DAILY_FEE*(1-DISCOUNT_RATE*0.01))*DURATION as SIGNED INTEGER) END) AS FEE
FROM CAR_HISTORY CH
LEFT JOIN (SELECT *
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN CP
WHERE CAR_TYPE = '트럭') CP
on CH.DURATION_TYPE = CP.DURATION_TYPE
ORDER BY 2 DESC, 1 DESC