코딩 문제풀이 | 프로그래머스 | MySQL | “GROUP BY”

isitcake_yes·2023년 2월 9일
0

코딩문제풀이

목록 보기
4/6
post-thumbnail

GROUP BY

🌱 Lv2.

진료과별 총 예약 횟수 출력하기

Q. APPOINTMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성해주세요. 이때, 컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.

SELECT mcdp_cd AS "진료과 코드", COUNT(mcdp_cd) AS "5월예약건수" 
FROM appointment 
WHERE MONTH(apnt_ymd)="05" AND YEAR(apnt_ymd)="2022" 
AND (apnt_cncl_yn ="N" OR apnt_cncl_yn IS NULL) 
GROUP BY mcdp_cd ORDER BY 2,1

성분으로 구분한 아이스크림 총 주문량

Q.상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요. 이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.

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 ingredient_type ORDER BY 2;

자동차 종류별 특정 옵션이 포함된 자동차 수 구하기

Q. CAR_RENTAL_COMPANY_CAR 테이블에서 '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요. 이때 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬해주세요.

SELECT car_type, COUNT(car_type) AS CARS FROM car_rental_company_car 
WHERE options LIKE "%통풍시트%" OR options LIKE '%열선시트%' OR options LIKE '%가죽시트%' 
GROUP BY car_type ORDER BY 1;

SELECT car_type, COUNT(car_type) AS CARS FROM car_rental_company_car 
WHERE options REGEXP ('통풍시트|열선시트|가죽시트')
GROUP BY car_type ORDER BY car_type ASC;

고양이와 개는 몇 마리 있을까

Q. 동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.

SELECT animal_type, COUNT(animal_type) FROM animal_ins 
GROUP BY animal_type 
ORDER BY FIELD (ANIMAL_TYPE, 'Cat','Dog')

입양 시각 구하기(1)

Q. 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

SELECT HOUR(datetime) AS hour, COUNT(datetime) AS count FROM animal_outs 
WHERE HOUR(datetime) BETWEEN 9 AND 19 
GROUP BY hour ORDER BY 1;

동명 동물 수 찾기

Q. 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

SELECT name, COUNT(name) AS count FROM animal_ins 
GROUP BY name HAVING COUNT(name)>1 ORDER BY name; 

가격대 별 상품 개수 구하기

Q. PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.

SELECT TRUNCATE(ct_id) AS products FROM product 
GROUP BY price_group ORDER BY price_group; 

☘️ Lv3.

카테고리 별 도서 판매량 집계하기

Q. 2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 카테고리명을 기준으로 오름차순 정렬해주세요.

SELECT category, SUM(sales) AS total_sales 
FROM book B LEFT JOIN book_sales S ON B.book_id = S.book_id 
WHERE MONTH(sales_date)="1" AND YEAR(sales_date)="2022" 
GROUP BY category ORDER BY 1;

즐겨찾기가 가장 많은 식당 정보 출력하기

Q. REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

SELECT food_type, rest_id, rest_name, favorites FROM rest_info A 
WHERE favorites = (SELECT MAX(favorites) FROM rest_info B where A.food_type = B.food_type)
GROUP BY food_type ORDER BY food_type DESC;

대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

Q. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.

SELECT MONTH(start_date) AS MONTH, car_id, COUNT(*) AS RECORDS
FROM car_rental_company_rental_history
WHERE (MONTH(start_date) BETWEEN 8 AND 10) 
AND car_id IN (
    SELECT car_id
    FROM car_rental_company_rental_history
    WHERE MONTH(start_date) BETWEEN 8 AND 10 GROUP BY CAR_ID HAVING COUNT(*)>=5
)
GROUP BY 1, 2
ORDER BY 1 ASC, 2 DESC

자동차 대여기록에서 대여가능 여부 구분하기

Q. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.

SELECT car_id, 
      MAX(IF("2022-10-16" BETWEEN start_date AND end_date, "대여중", "대여 가능")) AS AVAILABILITY
FROM car_rental_company_rental_history
GROUP BY car_id
ORDER BY car_id DESC;

🍀 Lv4.

입양 시각 구하기(2)

Q. 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

SET @i = -1;
SELECT (@i := @i + 1) AS HOUR
        , (SELECT COUNT(*) 
           FROM animal_outs 
           WHERE HOUR(datetime) = @i) AS COUNT
FROM animal_outs
WHERE @i < 23;
WITH RECURSIVE temp AS(
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR+1 FROM temp WHERE HOUR<23
)

SELECT HOUR, COUNT(animal_id) AS COUNT 
FROM animal_outs A RIGHT JOIN temp T ON HOUR(A.datetime)=T.HOUR 
GROUP BY HOUR ;

년, 월, 성별 별 상품 구매 회원 수 구하기

Q. USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.

SELECT YEAR(sales_date) AS year, MONTH(sales_date) AS month, 
		gender, COUNT(DISTINCT OS.user_id) AS users 
FROM user_info UI RIGHT JOIN online_sale OS 
ON UI.user_id=OS.user_id
WHERE gender IS NOT NULL
GROUP BY 1,2,3
ORDER BY 1,2,3;  

식품분류별 가장 비싼 식품의 정보 조회하기

Q. FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.

SELECT category, price AS max_price, product_name FROM food_product A
WHERE category IN ('과자', '국', '김치', '식용유') AND
price IN (SELECT MAX(price) FROM food_product B GROUP BY category)
GROUP BY category 
ORDER BY price DESC;

저자 별 카테고리 별 매출액 집계하기

Q. 2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.

SELECT A.author_id, author_name, category, SUM(sales*price) AS total_sales
FROM book_sales BS 
LEFT JOIN book B ON B.book_id=BS.book_id 
LEFT JOIN author A ON A.author_id=B.author_id 
WHERE YEAR(sales_date)=2022 AND MONTH(sales_date)=1 
GROUP BY author_id, category
ORDER BY author_id, category DESC;

🌟REGEXP 정규표현식

* Matching

  • | : 구분된 문자에 해당하는 문자열을 찾음.
data REGEXP ('예시1|예시2|예시3')
=
data like '%예시1%' OR data like '%예시2%'OR data like '%예시3%'
  • ^ : 시작하는 문자열을 찾음.
  • $ : 끝나는 문자열을 찾음.
data REGEXP ('^시작1|^시작2|끝$')
=
data like '시작1%' OR data like '시작2%'OR data like '%끝'
  • [ ] : [ ]안에 나열된 패턴에 해당하는 문자열을 찾음.
data REGEXP ('[123]d')
=
data like '%1d%' OR data like '%2d%'OR data like '%3d%'
  • . : 문자길이가 .의 개수 이상인 문자열을 찾음
data REGEXP ('...')
=
CHAR_LENGTH(data) >= 3 

* Times

  • * : 0회 이상 나타나는 문자, "a*" -> 'a', 'b', 'aa'
  • + : 1회 이상 나타나는 문자, "찌개+"-> "김치찌개", "된장찌개"
  • {m, n} : m회 이상 n회 이하 나타나는 문자, "치{1,2}" -> "치커리", "치카치카"
  • ? : 0-1회 나타나는 문자, "[가나다]?" -> "가오리", "나비", "다람쥐", "코끼리"

* Group

  • [A-z] or [:alpha:] or \a : 알파벳 대소문자 중 한개이상 포함된 문자열을 찾음.
  • [0-9] or [:digit:] or \d : 한개이상 숫자가 들어가는 문자열 찾음.

* Not

  • [^문자] : 괄호 안에 문자를 포함하지 않은 문자열을 찾음. "[^가나다]" -> "가오리", "나비", "다람쥐" 모두 제외됨.
profile
주니어 개발자 주니어발록 주니어예티 주니어레이스

0개의 댓글