✔ GROUP BY
자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기
[프로그래머스 151137]
/*
SELECT : 자동차 종류와 그에 따른 자동차 대수
FROM : CAR_RENTAL_COMPANY_CAR 테이블
WHERE : 통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차
GROUP BY : 자동차 종류
ORDER BY : 자동차 종류를 기준으로 오름차순 정렬
*/
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 CAR_TYPE
대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
[프로그래머스 151139]
- HAVING : GROUP BY한 결과에 조건을 적용
- BETWEEN a AND b : a와 b 사이 모든 값 해당 여부 조건
- DAYOFMONTH(data) : 한 달을 단위로 날짜만 리턴
- DAYOFYEAR(date) : 1년을 단위로 날짜만 리턴
- TO_DAYS(data) : 연도와 달을 모두 날짜화 시켜 리턴
- YEAR(date) : 연도를 리턴
- MONTH(date) : 달을 리턴
- MONTHNAME(date) : 달을 문자로 리턴
- WEEK(date) : 해당 연도에 몇 번째 주인지 리턴
- DAYNAME(data) : 요일을 문자로 리턴
- HOUR(time) : 시간 리턴
- MINUTE(time) : 분 리턴
- SECOND(time) : 초 리턴
/*
SELECT : 해당 기간 동안의 월별 자동차 ID와 총 대여 횟수, 이때 총 대여 횟수가 0인 경우에는 결과에서 제외
FROM : CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블
WHERE : 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들
GROUP BY : 해당 기간 동안의 월별 자동차 ID
ORDER BY : 월을 기준으로 오름차순 정렬, 같다면 자동차 ID를 기준으로 내림차순 정렬
*/
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10' -- 나머지 기간 제외
AND CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5)
GROUP BY MONTH, CAR_ID
ORDER BY MONTH, CAR_ID DESC
성분으로 구분한 아이스크림 총 주문량
[프로그래머스 133026]
/*
SELECT : 각 아이스크림 성분 타입과 그에 대한 아이스크림의 총주문량
FROM : FIRST_HALF, ICECREAM_INFO 테이블
GROUP BY : 아이스크림 성분 타입
ORDER BY : 총주문량 오름차순 정렬
*/
SELECT B.INGREDIENT_TYPE, SUM(A.TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF A JOIN ICECREAM_INFO B
ON A.FLAVOR = B.FLAVOR
GROUP BY B.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER
성분으로 구분한 아이스크림 총 주문량
[프로그래머스 164668]
/*
SELECT : 회원 ID, 닉네임, 총거래금액
FROM : USED_GOODS_BOARD, USED_GOODS_USER 테이블
WHERE : 완료된 중고 거래
GROUP BY : 회원 ID
HAVING : 총 금액이 70만원 이상
ORDER BY : 총거래금액 오름차순 정렬
*/
SELECT B.USER_ID, B.NICKNAME, SUM(A.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD A JOIN USED_GOODS_USER B
ON A.WRITER_ID = B.USER_ID
WHERE A.STATUS = 'DONE'
GROUP BY B.USER_ID
HAVING TOTAL_SALES >= 700000
ORDER BY TOTAL_SALES
즐겨찾기가 가장 많은 식당 정보 출력하기
[프로그래머스 131123]
/*
SELECT : 음식 종류, 식당 ID, 식당 이름, 즐겨찾기수
FROM : REST_INFO 테이블
WHERE : 음식 종류별로 즐겨찾기 수가 가장 많은 식당
GROUP BY : 음식 종류별
ORDER BY : 음식 종류 내림차순
*/
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC
카테고리 별 도서 판매량 집계하기
[프로그래머스 144855]
/*
SELECT : 카테고리, 카테고리 별 도서 총 판매량
FROM : BOOK, BOOK_SALES 테이블
WHERE : 2022년 1월
GROUP BY : 카테고리 별
ORDER BY : 카테고리명을 기준으로 오름차순 정렬
*/
SELECT A.CATEGORY AS CATEGORY, SUM(B.SALES) AS TOTAL_SALES
FROM BOOK A INNER JOIN BOOK_SALES B
ON A.BOOK_ID = B.BOOK_ID
WHERE B.SALES_DATE LIKE '2022-01-%'
GROUP BY A.CATEGORY
ORDER BY A.CATEGORY ASC
자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
[프로그래머스 157340]
/*
SELECT : 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시(반납 날짜가 2022년 10월 16일인 경우도 포함),
2022년 10월 16일에 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시
FROM : CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블
GROUP : 자동차 ID
ORDER BY : 자동차 ID를 기준으로 내림차순 정렬
*/
SELECT CAR_ID,
CASE
WHEN CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '2022-10-16' BETWEEN DATE_FORMAT(START_DATE, '%Y-%m-%d') AND DATE_FORMAT(END_DATE, '%Y-%m-%d')) THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
진료과별 총 예약 횟수 출력하기
[프로그래머스 132202]
/*
SELECT : 진료과코드 별 환자 수
FROM : APPOINTMENT 테이블
WHERE : 2022년 5월에 예약
GROUP BY : 진료콰코드
ORDER BY : 진료과별 예약한 환자 수를 기준으로 오름차순 정렬, 같다면 진료과 코드를 기준으로 오름차순 정렬
*/
SELECT MCDP_CD AS `진료과코드`, COUNT(MCDP_CD) AS `5월예약건수`
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05-%'
GROUP BY MCDP_CD
ORDER BY `5월예약건수`, `진료과코드`
저자 별 카테고리 별 매출액 집계하기
[프로그래머스 144856]
/*
SELECT : 저자 ID, 저자명, 카테고리, 매출액(판매량 * 판매가)
FROM : BOOK, AUTHOR, BOOK_SALES 테이블
WHERE : 2022년 1월의 판매
GROUP : 저자, 카테고리
ORDER BY : 저자 ID를 오름차순으로, 같다면 카테고리를 내림차순 정렬
*/
SELECT A.AUTHOR_ID, B.AUTHOR_NAME, A.CATEGORY, SUM((C.SALES) * A.PRICE) AS TOTAL_SALES
FROM BOOK A JOIN AUTHOR B ON A.AUTHOR_ID = B.AUTHOR_ID
JOIN BOOK_SALES C ON A.BOOK_ID = C.BOOK_ID
WHERE SALES_DATE LIKE '2022-01%'
GROUP BY A.AUTHOR_ID, A.CATEGORY
ORDER BY A.AUTHOR_ID, A.CATEGORY DESC
식품분류별 가장 비싼 식품의 정보 조회하기
[프로그래머스 131116]
/*
SELECT : 분류, 가격, 이름
FROM : FOOD_PRODUCT 테이블
WHERE : 식품분류별로 가격이 제일 비싼 식품, 식품분류가 '과자', '국', '김치', '식용유'인 경우
ORDER BY : 식품 가격을 기준으로 내림차순 정렬
*/
SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE (CATEGORY, PRICE) IN (SELECT CATEGORY, MAX(PRICE)
FROM FOOD_PRODUCT
GROUP BY CATEGORY)
AND CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY PRICE DESC
고양이와 개는 몇 마리 있을까
[프로그래머스 59040]
/*
SELECT : 생물 종에 따른 수
FROM : ANIMAL_INS 테이블
WHERE : 고양이 또는 강아지
GROUP BY : 생물 종
ORDER BY : 생물 종 오름차순 정렬
*/
SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID) AS count
FROM ANIMAL_INS
WHERE ANIMAL_TYPE IN ('Cat', 'Dog')
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
동명 동물 수 찾기
[프로그래머스 59041]
/*
SELECT : 두 번 이상 쓰인 이름, 횟수
FROM : ANIMAL_INS 테이블
GROUP BY : 이름별
HAVING : 2번 이상
ORDER BY : 이름순 정렬
*/
SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME
년, 월, 성별 별 상품 구매 회원 수 구하기
[프로그래머스 131532]
/*
SELECT : 년, 월, 성별 별로 상품을 구매한 회원수
FROM : USER_INFO, ONLINE_SALE 테이블
WHERE : 성별 정보가 있는 회원
GROUP BY : 년, 월, 성별
ORDER BY : 년, 월, 성별을 기준으로 오름차순 정렬
*/
SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH, GENDER, COUNT(DISTINCT A.USER_ID) AS USERS
FROM ONLINE_SALE A JOIN USER_INFO B
ON A.USER_ID = B.USER_ID
WHERE B.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER
입양 시각 구하기(1)
[프로그래머스 59412]
/*
SELECT : 시간대별 입양 수
FROM : ANIMAL_OUTS 테이블
WHERE : 9시부터 19시까지
GROUP BY : 시간대별
ORDER BY : 시간대 순으로 정렬
*/
SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 09 AND 19
GROUP BY HOUR
ORDER BY HOUR
입양 시각 구하기(2)
[프로그래머스 59413]
- SET @변수명 : 어떤 변수에 특정 값을 할당
/*
-1부터 시작해 22까지 +1씩 더해감
*/
SET @HOUR = -1;
SELECT (@HOUR := @HOUR + 1) AS HOUR
FROM ANIMAL_OUTS
WHERE @HOUR < 23;
/*
SELECT : 시간대별 입양 수
FROM : ANIMAL_OUTS 테이블
WHERE : 0시부터 23시까지
GROUP BY : 시간대별
ORDER BY : 시간대 순으로 정렬
*/
SET @HOUR = -1;
SELECT (@HOUR := @HOUR + 1) AS HOUR, (SELECT COUNT(ANIMAL_ID)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = @HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23;
가격대 별 상품 개수 구하기
[프로그래머스 131530]
/*
SELECT : 만원 단위의 가격대 별로 상품 개수
FROM : PRODUCT 테이블
GROUP BY : 만원 단위별
ORDER BY : 가격대를 기준으로 오름차순 정렬
*/
SELECT FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
언어별 개발자 분류하기
[프로그래머스 276036]
/*
SELECT : GRADE(Front End 스킬과 Python 스킬을 함께 가지고 있다면 A, C# 스킬을 가지고 있다면 B, 그 외의 Front End 스킬을 가지고 있다면 C, 위에 해당하지 않는다면 NULL), ID, EMAIL
FROM : DEVELOPERS 테이블
GROUP BY : GRADE, ID, EMAIL별
HAVING : GRADE가 존재
ORDER BY : GRADE와 ID를 기준으로 오름차순 정렬
*/
SELECT CASE
WHEN (SKILL_CODE & (SELECT SUM(CODE)
FROM SKILLCODES
WHERE CATEGORY = 'Front End'))
AND SKILL_CODE & (SELECT CODE
FROM SKILLCODES
WHERE NAME = 'Python') THEN 'A'
WHEN SKILL_CODE & (SELECT CODE
FROM SKILLCODES
WHERE NAME = 'C#') THEN 'B'
WHEN SKILL_CODE & (SELECT SUM(CODE)
FROM SKILLCODES
WHERE CATEGORY = 'Front End') THEN 'C'
ELSE NULL
END AS GRADE, ID, EMAIL
FROM DEVELOPERS
GROUP BY GRADE, ID, EMAIL
HAVING GRADE IS NOT NULL
ORDER BY GRADE, ID
조건에 맞는 사원 정보 조회하기
[프로그래머스 284527]
/*
SELECT : 평가 점수(상, 하반기 점수의 합)가 가장 높은 사원의 점수, 사번, 성명, 직책, 이메일
FROM : HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블
WHERE : 2022년
GROUP BY : 사번별
ORDER BY : 평가 점수 내림차순 정렬
*/
SELECT SUM(B.SCORE) SCORE, A.EMP_NO, A.EMP_NAME, A.POSITION, A.EMAIL
FROM HR_EMPLOYEES A JOIN HR_GRADE B
ON A.EMP_NO = B.EMP_NO
WHERE B.YEAR = 2022
GROUP BY B.EMP_NO
ORDER BY SCORE DESC
LIMIT 1
연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기
[프로그래머스 284528]
/*
SELECT : 사번, 성명, 평가 등급(96 이상이면 S, 90 이상이면 A, 80 이상이면 B, 이외는 C, 성과금(연봉 * 평가 등급에 따른 성과금 20, 15, 10, 0%)
FROM : HR_EMPLOYEES, HR_GRADE 테이블
GROUP BY : 사번별
ORDER BY : 사번 기준으로 오름차순 정렬
*/
SELECT E.EMP_NO, E.EMP_NAME, (CASE
WHEN AVG(SCORE) >= 96 THEN 'S'
WHEN AVG(SCORE) >= 90 THEN 'A'
WHEN AVG(SCORE) >= 80 THEN 'B'
ELSE 'C'
END) AS GRADE,
(CASE
WHEN AVG(SCORE) >= 96 THEN E.SAL * 0.2
WHEN AVG(SCORE) >= 90 THEN E.SAL * 0.15
WHEN AVG(SCORE) >= 80 THEN E.SAL * 0.1
ELSE 0
END) AS BONUS
FROM HR_EMPLOYEES E JOIN HR_GRADE G
ON E.EMP_NO = G.EMP_NO
GROUP BY E.EMP_NO
ORDER BY E.EMP_NO;
부서별 평균 연봉 조회하기
[프로그래머스 284529]
/*
SELECT : 부서 ID, 영문 부서명, 평균 연봉(소수점 첫째 자리에서 반올림)
FROM : HR_DEPARTMENT, HR_EMPLOYEES 테이블
GROUP BY : 부서 ID별
ORDER BY : 부서별 평균 연봉을 기준으로 내림차순 정렬
*/
SELECT A.DEPT_ID, A.DEPT_NAME_EN, ROUND(AVG(B.SAL), 0) AS AVG_SAL
FROM HR_DEPARTMENT A JOIN HR_EMPLOYEES B
ON A.DEPT_ID = B.DEPT_ID
GROUP BY A.DEPT_ID
ORDER BY AVG_SAL DESC
노선별 평균 역 사이 거리 조회하기
[프로그래머스 284531]
/*
SELECT : 노선, 총 누계 거리(역 사이 거리의 총 합, 소수 둘째자리에서 반올림한 뒤 단위(km)를 함께 출력), 평균 역 사이 거리(소수 셋째 자리에서 반올림 한 뒤 단위(km)를 함께 출력)
FROM : SUBWAY_DISTANCE 테이블
GROUP BY : 노선별
ORDER BY : 총 누계 거리를 기준으로 내림차순 정렬
*/
SELECT ROUTE,
CONCAT(ROUND(SUM(D_BETWEEN_DIST), 1), 'km') AS TOTAL_DISTANCE,
CONCAT(ROUND(AVG(D_BETWEEN_DIST), 2), 'km') AS AVERAGE_DISTANCE
FROM SUBWAY_DISTANCE
GROUP BY ROUTE
ORDER BY ROUND(SUM(D_BETWEEN_DIST), 1) DESC;
물고기 종류 별 잡은 수 구하기
[프로그래머스 293257]
/*
SELECT : 물고기의 이름, 잡은 수
FROM : FISH_INFO, FISH_NAME_INFO 테이블
GROUP BY : 물고기의 이름 별
ORDER BY : 잡은 수 기준으로 내림차순 정렬
*/
SELECT COUNT(A.ID) AS FISH_COUNT, B.FISH_NAME
FROM FISH_INFO A JOIN FISH_NAME_INFO B
ON A.FISH_TYPE = B.FISH_TYPE
GROUP BY B.FISH_NAME
ORDER BY FISH_COUNT DESC
월별 잡은 물고기 수 구하기
[프로그래머스 293260]
/*
SELECT : 물고기의 수, 월
FROM : FISH_INFO 테이블
GROUP BY : 월별
ORDER BY : 월을 기준으로 오름차순 정렬
*/
SELECT COUNT(ID) AS FISH_COUNT, MONTH(TIME) AS MONTH
FROM FISH_INFO
GROUP BY MONTH
ORDER BY MONTH
특정 조건을 만족하는 물고기별 수와 최대 길이 구하기
[프로그래머스 298519]
/*
SELECT : 잡은 수, 최대 길이, 물고기의 종류
FROM : FISH_INFO 테이블
GROUP BY : 물고기들 종류별
HAVING : 평균 길이가 33cm 이상인 물고기(10cm이하의 물고기들은 10cm로 취급하여 평균 길이를 구함)
ORDER BY : 물고기 종류에 대해 오름차순으로 정렬
*/
SELECT COUNT(*) AS FISH_COUNT, MAX(LENGTH) AS MAX_LENGTH, FISH_TYPE
FROM FISH_INFO
GROUP BY FISH_TYPE
HAVING AVG(IFNULL(LENGTH, 10)) >= 33
ORDER BY FISH_TYPE