스터디/SQL

[SQL 연습 문제] 프로그래머스 SQL 고득점 키트 문제 풀이(GROUP BY, HAVING)

skyggg3 2022. 4. 14. 23:33

이번 문제 풀이에서 사용할 SQL 문법을 먼저 알아보도록 하겠습니다.

 

테이블명 - bills

day time memu total
mon 점심 불족발 39,000
sat 점심 족발보쌈 세트 48,000
sat 저녁 보쌈국수세트 38,000
sun 저녁 보쌈 32,000
sun 저녁 반반족발 41,000

 

 

데이터 그룹으로 묶기
GROUP BY
-- 시간대별로 구매 금액의 합계 구하기
SELECT time 
     , SUM(total) 
FROM bills
GROUP BY time
-- 요일, 시간대별로 구매 금액의 합계 구하기
SELECT day
      ,time 
      ,SUM(total) 
FROM bills
GROUP BY day, time

 

SELECT와 GROUP BY절에는 같은 칼럼이 들어있어야 합니다.

GROUP BY절에는 그룹의 기준이 되는 컬럼을 적습니다. 해당 칼럼은 SELECT 절에도 있어야 한다는 것을 잊지 마세요.

 

-- 시간대별로 구매 금액의 합계 구하기. 단, 구매 금액이 40,000원 이상인 것만 출력
SELECT time 
     , SUM(total) 
FROM bills
GROUP BY time 
HAVING total >= 40000

프로그래머스 SQL 고득점 kit 문제 풀이

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

 

코딩테스트 연습 - 고양이와 개는 몇 마리 있을까

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

GROUP BY를 사용하여 동물 종류별로 묶고, ORDER BY를 사용하여 고양이가 먼저 조회될 수 있도록 하였습니다.

 

 

2. 동명 동물 수 찾기

 

코딩테스트 연습 - 동명 동물 수 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS 
GROUP BY NAME
HAVING COUNT(NAME) >= 2 
ORDER BY NAME

동물 이름 중 두 번 이상 쓰인 이름만 조회되도록 HAVING절에 조건을 걸고 ORDER BY를 사용해 결과를 이름 순으로 정렬하면 됩니다.

 

 

3. 입양 시각 구하기(1)

 

코딩테스트 연습 - 입양 시각 구하기(1)

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr

SELECT hour(datetime) AS HOUR, count(datetime) AS COUNT
FROM animal_outs
WHERE hour(datetime) between 9 and 19
GROUP hour(datetime)
ORDER BY HOUR

2018-02-22 07:06:00 형태로 되어있는 datetime 필드에서 ‘시’ 부분만 추출해야 합니다. hour이라는 날짜 함수를 사용하면 ‘시’부분만 구할 수 있습니다. 그다음 조건절로 9시 - 19시 사이의 시간만 조회하고 그룹으로 묶어서 카운팅 하면 됩니다. 시간대 순으로 정렬하기 위해 ORDER BY를 사용하였습니다.