깡뇽

[프로그래머스] SQL High Score Kit - GROUP BY 본문

Computer Language/SQL

[프로그래머스] SQL High Score Kit - GROUP BY

깡뇽 2022. 3. 2. 16:32
반응형

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

SELECT ANIMAL_TYPE, COUNT(*) AS count FROM ANIMAL_INS GROUP BY ANIMAL_TYPE

GROUP BY : 컬럼에서 같은 것들끼리 묶기

 

동명 동물 수 찾기

#방법1
SELECT NAME, COUNT(NAME) AS 'COUNT' FROM ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) >= 2 ORDER BY NAME

#방법2
SELECT NAME, COUNT(NAME) AS 'COUNT' FROM ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) > 1 ORDER BY NAME

#방법3
SELECT NAME, COUNT(*) AS COUNT FROM ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) >= 2 ORDER BY NAME

HAVING : 조건 걸기

+) WHERE은 개별 행에 적용되어서 해당 코드에서 WHERE을 사용하면 조건 적용이 되지 않는다.(그룹화나 집계가 발생한 후에 사용할 수 없기 때문에) 이럴 경우 HAVING을 사용하면 SELECT가 뽑아내는 결과 중에 해당 조건을 만족하는 행을 반환할 수 있다...! 또한 WHERE은 GROUP BY 앞에, HAVING은 GROUP BY 뒤에 사용할 수 있다.

 

입양 시각 구하기(1)

SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT' FROM ANIMAL_OUTS 
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19 
GROUP BY HOUR(DATETIME) 
ORDER BY HOUR(DATETIME)

 

입양 시각 구하기(2)

[시도1]

0시부터 23시까지 모두 출력해야 하는데 값이 없는 시간은 출력이 되지 않고 있다.

 

#솔루션

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

구글링을 통해 찾은 해답이다. 

HOUR 변수에 -1을 할당한다. SELECT문을 활용해서 원하는 데이터를 추출할 때에 -1 + 1을 한 HOUR(변수) 즉, 0부터 시작해 시간 데이터를 가져올 수 있게 된다. 그리고 두 번째 컬럼에서는 COUNT의 컬럼명으로 ANIMAL_OUTS 테이블의 HOUR(DATETIME)이 HOUR 변수와 같은 것들의 개수를 세어 추출한다. HOUR 변수가 23보다 작은 때까지의 데이터를 추출해달라는 의미이다. 마지막의 WHERE @HOUR < 23이 없으면 0부터 99까지 추출된다.

 

:= : SET과 함께 사용될 때, 대입연산자

SET : 변수를 선언할 때에 사용하며, 새로운 변수에 값을 할당할 수 있다.

ex) 변수 할당 및 출력

``` SET @변수명 = 변수값;

   SELECT @변수명; ```

반응형