스터디/SQL

[SQL] GROUP BY

latter2005 2021. 2. 28. 22:29

GROUP BY

SELECT 절과 함께 쓰이는 데이터를 원하는 그룹으로 나눌 때 사용합니다. DISTINCT "칼럼명"과 같이 결과를 하나로 묶어주는 역할을 합니다.

나눌 그룹의 칼럼명을 GROUP BY "칼럼명" 형식으로 사용하면 됩니다.

 

HAVING

GROUP BY에서 조건을 걸어주기 위한 절이며 WHERE 절과 다르게 집계함수와 함께 사용 가능합니다.

 

위의 쿼리문은 테이블에서 나이가 20 이상인 사람들의 수를 나이 별로 나타내게 됩니다.

 

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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

SELECT ANIMAL_TYPE, COUNT(*) AS count
FROM ANIMAL_INS 
WHERE ANIMAL_TYPE IN('Cat', 'Dog')
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;

 

동명 동물 수 찾기

SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME)>1
ORDER BY NAME;

 

입양 시각 구하기(1)

DATETIME 칼럼은 DATETIME 타입이며 시간을 추출하기 위해 DATE_FROMAT() 혹은 HOUR()을 사용합니다.

서브 쿼리로 DATETIME 임시 테이블을 만들고 이를 조건에 맞춰 9, 19 사이, 정렬해 출력합니다.

SELECT HOUR, COUNT(*) AS COUNT
FROM (
    SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR
    FROM ANIMAL_OUTS
)T
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR;

 

입양 시각 구하기(2)

변수를 이용해서 0부터 23까지 해당하는 시간대에서 입양된 동물의 수를 헤아려 출력합니다.

SET @T := -1;
SELECT @T:=@T+1 AS HOUR, (
    SELECT  COUNT(*)
    FROM ANIMAL_OUTS
    WHERE @T = HOUR(DATETIME)
)AS COUNT
FROM ANIMAL_OUTS
WHERE @T<23;

다른 풀이 방법으론 0~23까지 시간을 가지고 있는 임시 테이블을 만들고 이를 DATETIME 테이블과 조인하여 구하는 방법입니다. 이때 DATETIME에는 0~23까지 모든 수가 없을 수 있으므로 이를 방지하기 위해 임시 테이블을 기준으로 조인하는 LEFT JOIN을 사용하여 구합니다.

조인한 결과에는 해당 값이 없다면 NULL이 되므로 이를 0으로 채우기 위해 IFNULL 함수를 이용합니다.

SELECT T1.HOUR, IFNULL(T2.COUNT,0)
FROM (
SELECT 0 AS HOUR
    UNION SELECT 1  UNION SELECT 2  UNION SELECT 3  UNION SELECT 4
    UNION SELECT 5  UNION SELECT 6  UNION SELECT 7  UNION SELECT 8
    UNION SELECT 9  UNION SELECT 10  UNION SELECT 11  UNION SELECT 12
    UNION SELECT 13 UNION SELECT 14  UNION SELECT 15  UNION SELECT 16
    UNION SELECT 17  UNION SELECT 18  UNION SELECT 19  UNION SELECT 20
    UNION SELECT 21  UNION SELECT 22  UNION SELECT 23) T1
    LEFT JOIN(
        SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
        FROM ANIMAL_OUTS
        GROUP BY HOUR) AS T2 ON T1.HOUR = T2.HOUR

 

반응형

'스터디 > SQL' 카테고리의 다른 글

[SQL] String, Date 처리  (0) 2021.03.03
[SQL] Join  (0) 2021.03.02
[SQL] NULL 처리  (0) 2021.02.28
[SQL] 집계 함수  (0) 2021.02.26
[SQL] SELECT  (0) 2021.02.26