[SQL] 06. Group By 문제 정리

다나·2023년 2월 3일
0

SQL

목록 보기
6/6
post-thumbnail

Group By 문제 KEY POINT

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

난이도 : LEVEL 2

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

CAR_IDCAR_TYPEDAILY_FEEOPTIONS
1세단16000가죽시트,열선시트,후방카메라
2SUV14000스마트키,네비게이션,열선시트
3SUV22000주차감지센서,후방카메라
4트럭35000주차감지센서,네비게이션,열선시트
5SUV16000가죽시트,네비게이션,열선시트,후방카메라,주차감지센서
  • 결과
CAR_TYPECARS
SUV2
세단1
트럭1

문제 풀이

1️⃣ '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력한다.

  • 이때, WHERE OPTIONS in ('통풍시트', '열선시트', '가죽시트')라고 하는 경우, OPTIONS가 하나의 문자열로 이루어져 있어서, 해당 문자만을 가진 행만 출력한다. ("가죽시트,열선시트,후방카메라" -> 출력하지 못함)
  • WHERE OPTIONS like '%통풍시트%' or OPTIONS like '%열선시트%' or OPTIONS like '%가죽시트%'라고 할 수도 있지만, 해당 문제에서 시트가 위의 3가지의 경우밖에 없으므로 where OPTIONS like "%시트%"만 입력해도 된다.
  • group by CAR_TYPE를 사용하여 자동차 종류 별로 그룹화하고 count(*)로 조건을 만족하는 자동차의 개수를 센다.

2️⃣ 자동차 종류를 기준으로 오름차순 정렬한다.

  • order by CAR_TYPE
SELECT CAR_TYPE, count(*) as CARS
from CAR_RENTAL_COMPANY_CAR
where OPTIONS like "%시트%"
group by CAR_TYPE
order by CAR_TYPE

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

난이도 : LEVEL 2

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

APNT_YMDAPNT_NOPT_NOMCDP_CDMDDR_IDAPNT_CNCL_YNAPNT_CNCL_YMD
2022-04-14 09:30:0047PT22000064GSDR20170123NNULL
2022-04-15 10:30:0048PT22000065OBDR20100231NNULL
2022-05-15 17:30:0049PT22000086OBDR20100231NNULL
2022-05-18 10:30:0052PT22000019GSDR20100039NNULL
2022-05-19 12:00:0053PT22000020FMDR20010112NNULL
2022-05-22 08:30:0054PT22000021GSDR20100039NNULL
2022-05-04 10:30:0056PT22000023FMDR20090112NNULL
2022-05-14 15:30:0057PT22000074CSDR20200012NNULL
2022-05-24 15:30:0058PT22000085CSDR20200012NNULL
2022-05-28 10:00:0060PT22000092OSDR20100031NNULL

문제 풀이

1️⃣ 2022년 5월에 예약한 환자 수를 진료과 코드 별로 조회한다.

  • 먼저, 2022년 5월에 예약한 환자를 조회한다.
    where APNT_YMD like '2022-05%'
  • 그리고 진료과 코드별로 그룹화한다.
    group by MCDP_CD
  • 진료과 코드별로 행의 수를 센다 = 예약한 환자수
    count(*) as 5월예약건수

2️⃣ 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬한다.

  • 정렬 우선순위 : 1순위 = 환자 수, 2순위 = 진료과 코드
  • order by 5월예약건수, 진료과코드
SELECT MCDP_CD as 진료과코드, count(*) as 5월예약건수
from APPOINTMENT
where APNT_YMD like '2022-05%'
group by MCDP_CD
order by 5월예약건수, 진료과코드

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

난이도 : LEVEL 2

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

문제 풀이

1️⃣ 고양이와 개가 각각 몇 마리인지 조회한다.

  • ANIMAL_TYPE이 'CAT'인 것과 'DOG'인 것을 따로 그룹화한다.
  • group by ANIMAL_TYPE = 'CAT', ANIMAL_TYPE = 'DOG'
  • count(*) 함수를 사용하여 각각의 그룹별 행의 개수를 센다.
  • count(*) as count

2️⃣ 고양이를 개보다 먼저 조회한다.

  • 고양이(=CAT)이고 개(=DOG)라서, C가 D보다 앞이므로 ANIMAL_TYPE으로 정렬하면 고양이를 먼저 조회할 수 있다.
  • order by ANIMAL_TYPE
SELECT ANIMAL_TYPE, count(*) as count
from ANIMAL_INS
group by ANIMAL_TYPE = 'CAT', ANIMAL_TYPE = 'DOG'
order by ANIMAL_TYPE

4. 동명 동물 수 찾기 🦁

난이도 : LEVEL 2

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

문제 풀이

1️⃣ 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회한다.

  • 이름을 기준으로 그룹화한다.
  • group by NAME
  • 해당 이름이 두 번 이상 나온 경우만 조회한다.
  • 이때, where 조건문이 아닌 having 조건문을 사용해야 한다!!
  • Why? having그룹화하고 나서 조건을 적용하지만, where그룹화하기 전에 조건을 적용하기 때문이다!
  • having count(NAME) > 1

2️⃣ 이름 순으로 조회한다.

  • order by NAME
SELECT NAME, count(NAME) as 'COUNT'
from ANIMAL_INS
group by NAME
having count(NAME) > 1
order by NAME

5. 입양 시각 구하기(1) 🕐

난이도 : LEVEL 2

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

문제 풀이

1️⃣ 09:00부터 19:59까지, 각 시간대별로 그룹화한다.

  • 1) 주어진 DATETIME으로 그룹화할 경우 연도-월-날짜-시간-분-초 까지 모두 동일해야 그룹화되므로 DATE_FORMAT(DATETIME, "%H") as HOUR을 사용하여 시간만 추출한다.
  • 2) 시간을 기준으로 그룹화한다. group by HOUR
  • 3) 09:00부터 19:59까지이므로 해당 시간대에 맞는 그룹만 조회한다.
    having HOUR >= 9 and HOUR <= 19

2️⃣ 각 시간대 별로 입양이 몇 건이나 발생했는지 조회한다.

  • count(*) as COUNT를 사용하여 해당 그룹마다 몇 개의 행이 있는지를 센다.

3️⃣ 시간대 순으로 정렬한다.

  • order by HOUR
SELECT DATE_FORMAT(DATETIME, "%H") as HOUR, count(*) as COUNT
from ANIMAL_OUTS
group by HOUR
having HOUR >= 9 and HOUR <= 19
order by HOUR

profile
컴퓨터공학과 학생이며, 백엔드 개발자입니다🐰

0개의 댓글