DB, SQL

[프로그래머스] SQL SUM, MAX, MIN 사용

RuBPCase 2022. 1. 30. 13:28
728x90

원본 링크

https://programmers.co.kr/learn/courses/30/parts/17043

개요

이번엔 기본적인 SELECT문은 쓸 줄 안다는 전제하에 조금 응용된 문제들을 풀어보려 한다.
어떤 문제는 다른 문제와 풀이가 유사해서 다른 점만 기술하고 넘어갈 수 있다.

공통 조건

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

문제 1 (최댓값 구하기)

가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A399552 Dog 2013-10-14 15:38:00 Normal Jack Neutered Male
A379998 Dog 2013-10-23 11:42:00 Normal Disciple Intact Male
A370852 Dog 2013-11-03 15:04:00 Normal Katie Spayed Female
A403564 Dog 2013-11-18 17:03:00 Normal Anna Spayed Female

가장 늦게 들어온 동물은 Anna이고, Anna는 2013-11-18 17:03:00에 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

시간
2013-11-18 17:03:00

나만의 풀이 1

먼저, AS라는 기능을 소개하려 한다.
특정 컬럼을 조회할 때, SELECT (컬럼명) AS '이름'형태로 쓰면, 해당 컬럼의 이름을 바꿀 수 있다.
물론 이 문제에선 이름을 안 바꿔도 된다 했지만, 형태를 맞추기 위해 일부러 바꿨다.

MAX라는 메소드를 활용해서 풀 수 있으나, 우선 이전에 썼던 LIMIT을 써서 다음과 같이 풀어봤다.

SELECT DATETIME AS '시간' FROM ANIMAL_INS
ORDER BY DATETIME DESC LIMIT 1

어찌됐건 결과는 동일하게 나온다.

문제 2 (최솟값 구하기)

동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A399552 Dog 2013-10-14 15:38:00 Normal Jack Neutered Male
A379998 Dog 2013-10-23 11:42:00 Normal Disciple Intact Male
A370852 Dog 2013-11-03 15:04:00 Normal Katie Spayed Female
A403564 Dog 2013-11-18 17:03:00 Normal Anna Spayed Female

가장 먼저 들어온 동물은 Jack이고, Jack은 2013-10-14 15:38:00에 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

시간
2013-10-14 15:38:00

나만의 풀이 2

이번엔 아까와 다르게 MIN을 써서 풀었다.
해석하는데 크게 문제는 없으므로 상세 기술은 생략한다.

SELECT MIN(DATETIME) AS '시간' FROM ANIMAL_INS
ORDER BY DATETIME

문제 3 (동물 수 구하기)

동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A399552 Dog 2013-10-14 15:38:00 Normal Jack Neutered Male
A379998 Dog 2013-10-23 11:42:00 Normal Disciple Intact Male
A370852 Dog 2013-11-03 15:04:00 Normal Katie Spayed Female
A403564 Dog 2013-11-18 17:03:00 Normal Anna Spayed Female

동물 보호소에 들어온 동물은 4마리입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

count
4

나만의 풀이 3

사실 이것도 아까 것들을 적절히 조합하면 금방 풀 수 있다.
다만 COUNT라는 기능을 추가로 쓰게 된다.
여기선 모든 열(와일드 카드: *)을 기준으로 선택하여 COUNT했다.

SELECT COUNT(*) AS 'count' FROM ANIMAL_INS

문제 4 (중복 제거하기)

동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A562649 Dog 2014-03-20 18:06:00 Sick NULL Spayed Female
A412626 Dog 2016-03-13 11:17:00 Normal *Sam Neutered Male
A563492 Dog 2014-10-24 14:45:00 Normal *Sam Neutered Male
A513956 Dog 2017-06-14 11:54:00 Normal *Sweetie Spayed Female

보호소에 들어온 동물의 이름은 NULL(없음), *Sam, *Sam, *Sweetie입니다. 이 중 NULL과 중복되는 이름을 고려하면, 보호소에 들어온 동물 이름의 수는 2입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

count
2

나만의 풀이 4

문제 3의 응용 버전이다.
여기서도 하나의 기능을 더 알아야 풀 수 있다.
DISTINCT라는 키워드가 있는데, 중복 제거를 담당한다.
특정 column이 있으면, SELECT DISTINCT(컬럼명) ..의 형태로 해당 컬럼에서 중복된 데이터를 하나로 뭉칠 수 있다.
여기선 최종적으로 구하는 게 중복 제거된 이름의 개수이므로, 다시 COUNT를 씌워주면 된다.

SELECT COUNT(DISTINCT NAME) AS 'count' FROM ANIMAL_INS

이번 문제들은 몇몇 메소드나 키워드만 알면 금방 풀리는 문제였다.
예전에 내가 SQL을 배웠을 때 가장 어렵고 귀찮았던 부분은 JOIN연산 파트였던 걸로 기억난다.
그 이전까진 사실상 레퍼런스 참고하고 암기하면 금방 table 검색이 가능했던 것으로 기억난다.
따라서 적어도 아직 JOIN연산이 나오지 않은 지금은 크게 무리 없이 이해할 수 있을 것이라 본다.

맞다, 근데 SUM메소드는 어디 갔나고?
그러게... SUM을 사용할 만한 문제가 안 보이는 것 같다.
(내가 잘못 풀었나)

728x90