프로그래머스 SQL 답 GROUP BY 문제 풀이 #04
프로그래머스 SQL 답 GROUP BY 문제 풀이 #04
고양이와 개는 몇 마리 있을까
고양이와 개는 몇 마리 있을까? 하는 문제 입니다.
문제에서도 고양이와 개를 따로 세어보는 문제일듯 한 느낌이 듭니다.
문제를 확인 해보겠습니다.
위와 같이 늘 주어지는 ANIMAL_INS 테이블이 주어졌고, 여기서 고양이와 개를 각각 세어주면 됩니다. 그리고, 마지막에 보면 Cat을 Dog보다 먼저 출력 하라고 하네요. 여기서 필요한건 뭘까요? 일단 ROW수를 세어주는 COUNT() 함수와 함께, 고양이와 개로 각각 나워주는 GROUP BY 절이 필요 합니다.
그리고, 마지막에 ORDER BY 절을 이용해서 Cat이 Dog보다먼저 나오도록 오름차순으로 정렬 하면 되겠습니다. GROUP BY에 대해서 장황하게 설명하기엔 좀 기닌깐, 그건 아래 학습 링크를 추가 하도록 하겠습니다.
https://stricky.tistory.com/241
위 링크에 제가 GROUP BY에 대해서 잘 설명을 해놨으니 가서 보시면 되겠습니다.
이 GROUP BY와 COUNT()를 이용해서 정답을 작성 해보겠습니다.
SELECT ANIMAL_TYPE, COUNT(*)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;
개와 고양이가 구분되는 데이터인 ANIMAL_TYPE을 가지고 GROUP BY 하고, COUNT() 해주었습니다. 그리고 역시 마찬가지로 ANIMAL_TYPE을 이용하여 정렬을 하니 정답이 되었네요.
동명 동물 수 찾기
두번째 문제는 동명 동물 수 찾기 입니다.
문제를 함께 보시죠!
역시나 ANIMAL_INS 테이블이 주어졌구요. 여기서 동물의 이름이 동명이고, 두번이상 출현한 이름에 대해서 이름과 그 횟수를 출력하는 문제 입니다.
우선, GROUP BY를 통해서 각 이름별 건수를 찾고, 거기서 두번이상 사용되는 동물의 이름을 HAVING으로 골라내 보겠습니다. HAVING은 SQL에서 GROUP BY를 사용 했을때, WHERE 절 처럼 사용되는 문법이라고 생각하시면 됩니다.
WHERE절로 걸러내려면, INLINE VIEW로 한번 SQL을 싸서 나가야 하는데, HAVING을 사용하면 바로 걸러 낼 수 있는 장점이 있습니다.
다시 문제를 보면 이름이 없는 동물은 집계에서 제외해야 한다고 하니, COUNT를 할때 NAME을 명시 해주도록 하겠습니다. 그리고, 마지막으로 이름 순으로 정렬을 해야 한다고 하네요. 정렬은 ORDER BY를 쓰면 되겠죠?
정답을 확인 해보겠습니다.
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME;
입양 시각 구하기(1)
다음 문제는 입양 시각을 구하는 문제네요.
문제를 보면, 몇시에 입양이 활발하게 일어나는지를 확인 하는 문제 입니다. 각 시간대 별로 입양이 몇건이나 발생 했는지를 조회하고, 결과는 시간순으로 정렬 해야 합니다.
일단, 시간별로 GROUP BY 를 해야할것 이구요. 마지막에 ORDER BY로 정렬을 해주면 되겠습니다. 조건에 9시부터 19시 59분 까지라는것도 명시 해야겠군요.
DATETIME 데이터 형태에서 시간만 빼는건, 다음과 같은 방법을 사용 합니다. (물론, 여러가지가 있지만, 그중 하나 입니다.)
TO_CHAR(DATETIME, 'HH24')
이렇게 날짜 데이터에서 시간만 빼낼수가 있습니다.
그럼 정답을 확인 해보겠습니다.
SELECT TO_CHAR(DATETIME, 'HH24') AS HOUR, COUNT(*)
FROM ANIMAL_OUTS
WHERE TO_CHAR(DATETIME, 'HH24') BETWEEN 9 AND 20
GROUP BY TO_CHAR(DATETIME, 'HH24')
ORDER BY TO_CHAR(DATETIME, 'HH24')
##참고: MYSQL날짜 함수 사용법##
2020.03.31 - [Database/sql 강의] - sql 독학 강의 # 단일행 함수 잘 사용 하기(날짜 함수) 6편 -sTricky
입양 시각 구하기(2)
이번 챕터의 마지막 네번째 문제 입니다.
문제 부터 확인 해보겠습니다.
문제를 보니, 위에서 푼 문제와 거의 흡사하네요. 왜 이렇게 같은 문제가 나왔는지 의아할정도 입니다.
사실 여긴 함정이 있습니다. 기존 문제와 같이 했다가는 0시 부터 아침까지는 데이터가 없기 때문에 출력 되지 않을겁니다. 그래서 24시까지 나오도록 CONNECT BY 라는 문법을 사용하여 출력 하도록 하겠습니다.
그리고, 모든 빈값이 나오도록 LEFT OUTER JOIN 도 함께 사용하도록 하겠습니다.
정답을 같이 확인 해보도록 하겠습니다.
SELECT HR.HOUR, NVL(ST.CNT, 0)
FROM (SELECT ROWNUM-1 AS HOUR
FROM DUAL CONNECT BY LEVEL <= 24) HR LEFT OUTER JOIN
(SELECT DECODE(SUBSTR(TO_CHAR(DATETIME, 'HH24'), 1, 1), '0', SUBSTR(TO_CHAR(DATETIME, 'HH24'), 2, 1), TO_CHAR(DATETIME, 'HH24')) AS HOUR, COUNT(*) AS CNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME, 'HH24')
ORDER BY TO_CHAR(DATETIME, 'HH24')) ST
ON HR.HOUR = ST.HOUR
ORDER BY HR.HOUR;
자, 오늘 GROUP BY에 대한 문제를 함께 풀어 봤습니다.
수고 많으셨어요.
다음 시간에 뵈어요!
by.sTricky