SQL/SQL 문제풀이 스터디

[4주차] 프로그래머스: GROUP BY/ IS NULL/ JOIN

dundunee 2022. 11. 22. 23:41

문제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