[4주차] 프로그래머스: GROUP BY/ IS NULL/ JOIN
문제1. 프로그래머스 > GROUPBY > 년, 월, 성별 별 상품 구매 회원 수 구하기 #날짜함수 #집계함수 #조인 #GROUPBY
SELECT YEAR(OS.SALES_DATE),
MONTH(OS.SALES_DATE),
UI.GENDER,
COUNT(DISTINCT OS.USER_ID)
FROM ONLINE_SALE OS
INNER JOIN USER_INFO UI ON OS.USER_ID = UI.USER_ID
WHERE UI.GENDER IS NOT NULL
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3
문제2. 프로그래머스 > GROUPBY > 년, 월, 성별 별 상품 구매 회원 수 구하기 #SET명렁어
SET @HOUR = -1; #@HOUR 변수에 -1을 할당해줌, 대입연산자 =
SELECT (@HOUR := @HOUR +1) AS HOUR, # 할당된 @HOUR 변수에 1씩 더함, 대입연산자 :=
(SELECT COUNT(HOUR(DATETIME))
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = @HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23;
HOUR(DATETIME)으로 출력되지 않는 값들을 출력해줘야 했다. 이때 SET 명령어를 사용하며, SET 명령어는 어떤 변수에 특정 값을 할당할 때 쓰는 명령어이다.
문제3. 프로그래머스 > GROUPBY > 가격대 별 상품 개수 구하기 #CASE~WHEN #집계함수 #GROUPBY
SELECT CASE
WHEN PRICE < 10000 THEN 0
WHEN (PRICE >= 10000) AND (PRICE < 20000) THEN 10000
WHEN (PRICE >= 20000) AND (PRICE < 30000) THEN 20000
WHEN (PRICE >= 30000) AND (PRICE < 40000) THEN 30000
WHEN (PRICE >= 40000) AND (PRICE < 50000) THEN 40000
WHEN (PRICE >= 50000) AND (PRICE < 60000) THEN 50000
WHEN (PRICE >= 60000) AND (PRICE < 70000) THEN 60000
WHEN (PRICE >= 70000) AND (PRICE < 80000) THEN 70000
ELSE 80000
END PRICE_GROUP,
COUNT(DISTINCT PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
문제4. 프로그래머스 > ISNULL > 경기도에 위치한 식품창고 목록 출력하기 #CASE~WHEN #LEFT() #ISNULL
SELECT WAREHOUSE_ID,
WAREHOUSE_NAME,
ADDRESS,
CASE WHEN FREEZER_YN IS NULL THEN "N" ELSE FREEZER_YN END AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE LEFT(ADDRESS,3) = "경기도"
ORDER BY WAREHOUSE_ID
문제5. 프로그래머스 > ISNULL > 이름이 없는 동물의 아이디 # ISNULL
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID
문제6. 프로그래머스 > ISNULL > 이름이 있는 동물의 아이디 #ISNOTNULL
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID
문제7. 프로그래머스 > ISNULL > NULL 처리하기 #CASE~WHEN #ISNULL
SELECT ANIMAL_TYPE,
CASE WHEN NAME IS NULL THEN "No name" ELSE NAME END AS NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
문제8. 프로그래머스 > ISNULL > 나이정보가 없는 회원수 구하기 #COUNT #ISNULL
SELECT COUNT(DISTINCT USER_ID) AS USERS
FROM USER_INFO
WHERE AGE IS NULL
문제9. 프로그래머스 > JOIN > 주문량이 많은 아이스크림들 조회하기 #UNION #GROUPBY #COUNT #JOIN #SUM
SELECT DB.FLAVOR AS FLAVOR
FROM (
SELECT *
FROM FIRST_HALF
UNION ALL
SELECT *
FROM JULY
) DB
GROUP BY FLAVOR
ORDER BY SUM(DB.TOTAL_ORDER) DESC
LIMIT 3
UNION을 쓴 이유는 7월에 새로운 맛이 생겼을 수도 있기 때문이다
# JOIN을 쓴 경우
SELECT FH.FLAVOR AS FLAVOR
FROM FIRST_HALF FH
INNER JOIN JULY J ON FH.FLAVOR = J.FLAVOR
GROUP BY FLAVOR
ORDER BY SUM(FH.TOTAL_ORDER) + SUM(J.TOTAL_ORDER) DESC
LIMIT 3
문제10. 프로그래머스 > JOIN > 그룹별 조건에 맞는 식당목록출력하기 #JOIN #서브쿼리 #GROUPBY #ORDERBY
SELECT MP.MEMBER_NAME,
RR.REVIEW_TEXT,
DATE_FORMAT(RR.REVIEW_DATE, "%Y-%m-%d")
FROM MEMBER_PROFILE MP
INNER JOIN REST_REVIEW RR ON MP.MEMBER_ID = RR.MEMBER_ID
WHERE RR.MEMBER_ID = (
SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY COUNT(REVIEW_ID) DESC
LIMIT 1 )
ORDER BY 3, 2
이 문제는 정답처리되었지만 잘못된 문제라고 생각한다. 리뷰를 많이 남긴 멤버는 김민재를 포함한 총 3명이었다. 따라서 처음에 이 3명에 대한 데이터를 모두 추출하였으나 틀렸다. 출제를 할 때 조건을 추가해주었으면 좋았을 법 하다.
결정적으로 문제 제목도 틀렸다!
문제11. 프로그래머스 > JOIN > 5월 식품들의 총매출 조회하기 #집계함수 #조인 #날짜함수 #GROUPBY
SELECT FO.PRODUCT_ID,
FP.PRODUCT_NAME,
SUM(FO.AMOUNT) * FP.PRICE AS TOTAL_SALES
FROM FOOD_ORDER FO
INNER JOIN FOOD_PRODUCT FP ON FO.PRODUCT_ID = FP.PRODUCT_ID
WHERE YEAR(PRODUCE_DATE) = 2022 AND MONTH(PRODUCE_DATE) = 5
GROUP BY 1, 2
ORDER BY 3 DESC, 1
이 문제에서 먼저 2022년 5월에 생산된 품목은 2-3개가 더 있는것으로 확인되나 이 품목들은 FOOD_PRODUCT 테이블에 없음을 추측해볼 수 있다(데이터가 추출되지 않음)
문제12. 프로그래머스 > JOIN > 없어진 기록 찾기 #WHER절 #NOT IN
SELECT DISTINCT ANIMAL_ID,
NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (SELECT DISTINCT ANIMAL_ID FROM ANIMAL_INS)
👉 조인을 쓰는 문제이지만 WHERE절 서브쿼리를 이용해 충분히 풀수있는 문제이다.
문제13. 프로그래머스 > JOIN > 있었는데요 없었습니다 #조인
SELECT AI.ANIMAL_ID,
AI.NAME
FROM ANIMAL_INS AI
INNER JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE AI.DATETIME > AO.DATETIME
ORDER BY AI.DATETIME
문제14. 프로그래머스 > JOIN > 오랜기간 보호한 동물(1) #WHRE절 #NOTIN #LIMIT
SELECT NAME,
DATETIME
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN (SELECT DISTINCT ANIMAL_ID FROM ANIMAL_OUTS)
ORDER BY DATETIME
LIMIT 3
문제15. 프로그래머스 > JOIN > 보호소에서 중성화한 동물 #조인 #WHERE절 #IN
SELECT AI.ANIMAL_ID,
AI.ANIMAL_TYPE,
AI.NAME
FROM ANIMAL_INS AI
INNER JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE (AI.SEX_UPON_INTAKE IN ('Intact Male','Intact Female')) AND
(AO.SEX_UPON_OUTCOME IN ('Neutered Male', 'Spayed Female'))
ORDER BY 1