~고군분투 인생살이~

[GROUP BY] 입양 시각 구하기(2) 본문

SQL/프로그래머스

[GROUP BY] 입양 시각 구하기(2)

소금깨 2022. 5. 21. 00:08

문제설명

 

풀이과정

입양 시각 구하기(1)처럼 쿼리를 짜면 0~6시 까지의 결과가 출력되지 않는 문제가 발생한다.

이런 경우, 0~6시 까지의 데이터를 따로 생성해야 하기 때문에 SET(로컬변수) 명령어를 사용해서 문제를 풀어나가야 한다.

 

SET?

 

SQL SET

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

정답

SET @HOUR = -1; --변수 선언

SELECT (@HOUR := @HOUR +1) AS HOUR,
    (SELECT COUNT(HOUR(DATETIME)) -- 서브쿼리
    FROM ANIMAL_OUTS 
    WHERE HOUR(DATETIME)=@HOUR) AS COUNT 
FROM ANIMAL_OUTS
WHERE @HOUR < 23;

SET 옆에 변수명과 초기값을 설정할 수 있다.

- @가 붙은 변수는 프로시저가 종료되어도 유지된다

- 이를 통해 값을 누적하여 0부터 23까지 표현할 수 있음

 

@HOUR은 초기값을 -1로 설정합니다. 

PL/-SQL 문법에서 :=은 비교연산자 =과 혼동을 피하기 위한 대입 연산입니다.

 

SELECT(@HOUR := @HOUR + 1)은 @HOUR의 값에 1씩 증가시키면서 SELECT문 전체를 실행하게 됩니다

 

이 때 처음에 @HOUR 값이 -1인데, 이 식에 의해 +1이 되어 0이 저장됩니다

- HOUR 값이 0부터 시작할 수 있습니다.

- WHERE @HOUR<23일 때 까지, @HOUR값이 계속 1씩 증가합니다. 

 

한 가지 주의해야 할 점은 마지막 WHERE 절에서 '@HOUR' 을 사용했다는 점이다. 그냥 'HOUR' 을 사용하면 안될까? 안 된다. 왜냐하면 'HOUR' 이라는 변수는 SELECT 절에서 새롭게 만들어진 새로운 칼럼변수이기 때문이다.(이러한 주의 사항을 기억하고 있으면 다른 문제 풀이에 많은 도움이 된다.)

 

그래서 '@HOUR' 을 사용했기 때문에 '23시 까지'의 값을 출력하기 위해 '@HOUR < 23'이 된다. 왜냐하면 '@HOUR' 은 '@HOUR + 1'로 재할당 되었기 때문이다.

 

@HOUR := @HOUR +1

 

참고한 블로그 

 

 

[프로그래머스] 입양 시각 구하기(1), (2) (GROUP BY, HAVING, SET)

[프로그래머스] 입양 시각 구하기(1), (2)

chanhuiseok.github.io

 

[SQL] MySQL - SET 과 서브쿼리 사용하기

🔊 본 포스팅에서 사용되는 테이블의 자료와 출처는 프로그래머스임을 밝힙니다. 더 다양한 SQL 문제를 풀어보시려면 프로그래머스 사이트를 방문해보세요! 이번 포스팅에서 소개할 SQL 구문은

techblog-history-younghunjo1.tistory.com

 

Comments