🚩 프로그래머스(programmers)에서 제공하는 SQL 문제풀기
🚩 GROUP BY
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59041
2. 코드
SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT >= 2 AND NAME IS NOT NULL
ORDER BY NAME ASC;
3. 코드 해석
해당 문제는 ANIMAL_INS
테이블에서 동물 이름 중 두 번 이상 쓰인 이름(NAME
)과 해당 이름이 쓰인 횟수(COUNT
)을 조회하기 위해 SELECT~FROM문
을 사용한다. 이때 GROUP BY
절을 활용하여 동물 이름(NAME
)으로 그룹화하고, HAVING 조건
절로 각 그룹에서 두 번 이상 쓰인 횟수(COUNT >= 2
)이면서 이름이 없는 동물은 집계에서 제외(NAME IS NOT NULL
)하는 조건을 추가한다. 또한 이름(NAME
)순으로 나열해야 되므로 ORDER BY
절과 오름차순 정렬인 ASC
를 추가한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59040
2. 코드
SELECT ANIMAL_TYPE, COUNT(*) AS count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC;
3. 코드 해석
해당 문제는 ANIMAL_INS
테이블에서 동물 중 고양이와 개가 각각 몇 마리인지를 조회하기 위해 SELECT~FROM
문을 사용한다. 고양이와 개는 생물 종(ANIMAL_TYPE
)으로 파악이 가능하기 때문에 GROUP BY
절을 활용하여 생물 종(ANIMAL_TYPE
)으로 그룹화하고, 이때 각각 몇 마리인지는 COUNT(*)
함수로 알 수 있다. 고양이를 개보다 먼저 조회하기 위해 생물 종(ANIMAL_TYPE
)순으로 나열해야 되므로 ORDER BY
절과 오름차순 정렬인 ASC
를 추가한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59412
2. 코드
SELECT DATE_FORMAT(DATETIME, '%k') AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY HOUR*1 ASC;
3. 코드 해석
해당 문제는 ANIMAL_OUTS
테이블에서 몇 시에 입양이 가장 활발하게 일어났는지 조회하기 위해 SELECT~FROM
문을 사용한다. 입양일(DATETIME
)에서 입양 시간 중에 시간대(%k
)만 추출하기 위해 DATE_FORMAT(날짜,형식)
함수를 사용하고 별칭을 HOUR
로 한다. GROUP BY
절을 활용하여 시간대(HOUR
)로 그룹화하고, HAVING 조건
절로 09:00부터 19:59까지(HOUR >= 9 AND HOUR <= 19
)의 조건을 추가한다. 따라서 각 시간대별로 입양이 몇 건이나 발생했는지는 COUNT(*)
함수로 알 수 있다. 또한 시간대(HOUR
)순으로 나열해야 되므로 ORDER BY
절과 오름차순 정렬인 ASC
를 추가한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131530
2. 코드
SELECT TRUNCATE(PRICE, -4) AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC;
3. 코드 해석
해당 문제는 PRODUCT
테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하기 위해 SELECT~FROM
문을 사용한다. 이때 판매가(PRICE
)는 TRUNCATE(숫자, 버림할 자릿수)
함수를 사용하여 0원 ~ 1만원 미만은 0, 1만원 이상 ~ 2만원 미만은 1, ..., 으로 가격대를 만들고 해당 별칭을 PRICE_GROUP
으로 한다. GROUP BY
절을 활용하여 가격대(PRICE_GROUP
)로 그룹화하고, 이때 가격대 별 상품 개수가 몇 개인지는 COUNT(*)
함수로 알 수 있다. 가격대(PRICE_GROUP
)를 기준으로 나열해야 되므로 ORDER BY
절과 오름차순 정렬인 ASC
를 추가한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/132202
2. 코드
SELECT MCDP_CD AS 진료과코드, COUNT(*) AS 5월예약건수
FROM APPOINTMENT
WHERE MONTH(APNT_YMD)=5
GROUP BY 진료과코드
ORDER BY 5월예약건수 ASC, 진료과코드 ASC;
3. 코드 해석
해당 문제는 APPOINMENT
테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하기 위해 SELECT~FROM
문을 사용한다. WHERE
절에 2022년 5월 예약(MONTH(APNT_YMD)=5
)의 조건을 추가한다. GROUP BY
절을 활용하여 진료과코드(MCDP_CD
)로 그룹화하한다. 따라서 각 진료과별 예약한 환자 수가 몇 명인지는 COUNT(*)
함수로 알 수 있다. 또한 ORDER BY
절을 사용하여 진료과별 예약한 환자 수(5월예약건수
)기준으로 오름차순 정렬(ASC
)하고, 예약한 환자 수가 같다면 진료과 코드(진료과코드
)를 기준으로 오름차순 정렬(ASC
)한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131123
2. 코드
SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES
FROM (SELECT FOOD_TYPE, MAX(FAVORITES) AS MAX_FAVORITES FROM REST_INFO GROUP BY FOOD_TYPE) B
JOIN REST_INFO A
ON A.FOOD_TYPE = B.FOOD_TYPE
WHERE A.FAVORITES = B.MAX_FAVORITES
ORDER BY A.FOOD_TYPE DESC;
3. 코드 해석
해당 문제는 REST_INFO
테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류(FOOD_TYPE
), ID(REST_ID
), 식당 이름(REST_NAME
), 즐겨찾기수(FAVORITES
)를 조회하기 위해 SELECT~FROM
문을 사용한다. 이때 GROUP BY
절을 활용하여 음식종류(FOOD_TYPE
)로 그룹화하고, MAX()함수
를 사용하여 음식종류별 즐겨찾기수(FAVORITES
)가 가장 많은 음식종류(FOOD_TYPE
)와 즐겨찾기수(FAVORITES
)를 조회하는 SELECT~FROM
문을 만든다(B
테이블). B
테이블과 REST_INFO
테이블을 내부 조인(INNER JOIN
)을 활용하여 즐겨찾기수(FAVORITES
)로 묶어서 WHERE 조건
으로 음식종류별로 즐겨찾기수가 가장 많은 식당을 조회한다. 음식 종류(FOOD_TYPE
)를 기준으로 나열해야 되므로 ORDER BY
절과 내림차순 정렬인 DESC
를 추가한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59413
2. 코드
WITH RECURSIVE HOUR_TABLE AS(
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR+1 FROM HOUR_TABLE WHERE HOUR < 23
)
SELECT HOUR_TABLE.HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM HOUR_TABLE
LEFT OUTER JOIN ANIMAL_OUTS
ON HOUR(DATETIME) = HOUR_TABLE.HOUR
GROUP BY HOUR_TABLE.HOUR
ORDER BY HOUR_TABLE.HOUR;
3. 코드 해석
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131116
2. 코드
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 MAX_PRICE DESC;
3. 코드 해석
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131532
2. 코드
SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH, GENDER, COUNT(DISTINCT(A.USER_ID)) AS USERS
FROM USER_INFO A
JOIN ONLINE_SALE B
ON A.USER_ID = B.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR ASC, MONTH ASC, GENDER ASC;
3. 코드 해석