SQL/SQL 문제풀이 스터디
[5주차] 프로그래머스: JOIN, STRING, DATE
dundunee
2022. 12. 8. 16:36
문제1. 프로그래머스 > JOIN > 상품별 온라인 매출 구하기 #JOIN #집계함수 #GROUPBY
SELECT P.PRODUCT_CODE,
SUM(O.SALES_AMOUNT) * P.PRICE 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
문제2. 프로그래머스 > JOIN > 상품을 구매한 회윈 비율 구하기 #날짜함수 #집계함수
SELECT YEAR(OS.SALES_DATE) AS YEAR,
MONTH(OS.SALES_DATE) AS MONTH,
COUNT(DISTINCT OS.USER_ID) AS PUCHASED_USERS,
ROUND((COUNT(DISTINCT OS.USER_ID)) / (SELECT COUNT(DISTINCT USER_ID) FROM USER_INFO WHERE YEAR(JOINED) = 2021), 1) AS PUCHASED_RATIO
FROM USER_INFO UI
INNER JOIN ONLINE_SALE OS ON UI.USER_ID = OS.USER_ID
WHERE YEAR(UI.JOINED) = 2021
GROUP BY 1, 2
ORDER BY 1, 2
SELECT 절에서 연산을 할 때 SELECT절 서브쿼리를 써본적은 처음이다. 서브쿼리로 들어간 절은 전체 회원수를 집계해야하는 것이기 때문에 월 조건이 걸려서는 안되므로 위와 같이 쿼리를 작성하였음을 기억하자.
문제3. 프로그래머스 > String, Date > 취소되지 않은 진료 예약 조회하기 #JOIN
SELECT A.APNT_NO,
P.PT_NAME,
P.PT_NO,
A.MCDP_CD,
D.DR_NAME,
A.APNT_YMD
FROM APPOINTMENT A
INNER JOIN PATIENT P ON A.PT_NO = P.PT_NO
INNER JOIN DOCTOR D ON A.MDDR_ID = D.DR_ID
WHERE DATE_FORMAT(A.APNT_YMD, '%Y-%m-%d') = '2022-04-13' AND A.MCDP_CD = "CS" AND A.APNT_CNCL_YN = "N"
ORDER BY A.APNT_YMD
조인을 할 때는 key를 잘 보자!
문제4. 프로그래머스 > String, Date > 조건별로 분류하여 주문상태 출력하기 #CASE WHEN #DATE_FORMAT()
SELECT ORDER_ID,
PRODUCT_ID,
DATE_FORMAT(OUT_DATE, '%Y-%m-%d') as OUT_DATE,
CASE
WHEN OUT_DATE <= '2022-05-01' THEN "출고완료"
WHEN OUT_DATE > '2022-05-01' THEN "출고대기"
ELSE "출고미정"
END AS 출고여부
FROM FOOD_ORDER
ORDER BY ORDER_ID
새로운 컬럼을 생성해서 조건별로 값을 출력해야 한다면 SELECT절 CASE WHEN문을 기억하자!
문제5. 프로그래머스 > String, Date > 루시와 엘라 찾기 #문자열 IN
SELECT ANIMAL_ID,
NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID
문제6. 프로그래머스 > String, Date > 이름에 EL 들어가는 동물 찾기 #들어간 문자열 찾기 #LIKE%
SELECT ANIMAL_ID,
NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = "Dog" and
(NAME LIKE '%EL%' OR NAME LIKE '%el%')
ORDER BY NAME
문자열 안에 들어 있는 문자를 찾고 싶다면 컬럼 LIKE '%'를 쓰면 된다. 이따 %는 어떤 것도 봐도 된다는 의미로
- LIKE '문자열%': 문자열이 맨 앞에 포함되어있고, 그 뒤에는 어떤 것도 와도 된다
- LIKE '%문자열%': 문자열이 가운데에 들어가있고, 앞뒤로 아무거나 와도 된다.
- LIKE '%문자열': 문자열이 뒤에 오고 앞에는 아무거나 와도 된다.
로 기억하면 쉬울것이다!
문제7. 프로그래머스 > String, Date > 이름에 EL 들어가는 동물 찾기 #CASE WHEN
SELECT ANIMAL_ID,
NAME,
CASE
WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN "O"
WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN "O"
ELSE "X"
END AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
문제8. 프로그래머스 > String, Date > 오랜기간 보호한 동물(2) #ORDER BY 조건 #LIMIT
SELECT AI.ANIMAL_ID,
AI.NAME
FROM ANIMAL_INS AI
INNER JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID
GROUP BY AI.ANIMAL_ID
ORDER BY (AO.DATETIME - AI.DATETIME) DESC
LIMIT 2
날짜 계산이다. 보호기간이 가장 오래된 동물을 찾는 것이므로 ORDER BY절에 조건을 두면 된다.
문제9. 프로그래머스 > String, Date > DATETIME에서 DATE로 형 변환 #DATE_FORMAT()
SELECT ANIMAL_ID,
NAME,
DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
문제10. 프로그래머스 > String, Date > 카테고리 별 상품개수 구하기 #LEFT #집계함수
SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY,
COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY CATEGORY