[쿼리 공부] [난이도 극악] 중급 4 입양 시각 구하기 (2) (HOUR, TO_CHAR조건에 빈값 0 채우기 PLSQL Set 함수(Mysql), Connect By(Oracle))
전 문제를 완파한 입장에서 총 3번 정도의 고비가 왔던 거 같은데 이번 문제가 첫 번째 고비입니다.
저를 포함한 우리 SQL린이들 파이팅 ㅠ
없는 값을 넣어 주는거라 쉽지 않습니다. 부족한 분석력으로 글을 써볼게요.
[해설]
모든 프로그래머스 SQL 문제들은 테이블 명, 테이블 스키마(테이블의 구성), 쿼리 목표, 그리고 예시로 구성이 됩니다.
(지워져서 다시 올려요)
이 문제에 0~8시, 20~23시 값을 0을 추가하는 문제입니다.
재귀적으로 판단해서 없는 값을 추가하는 방법으로 이 문제는 Mysql과 Oracle 언어마다 풀이법이 다릅니다.
mysql의 경우 SET함수를 써서 @플래그를 달고 변수 선언을 하면 가능합니다.
(뭔 소린지 이해가 안 되신다면.... @hour 플래그를 그냥 변수라고 생각하고 반복문이라 생각하면 편합니다.
[정답]
Mysql 모범 답안.
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;
Oracle 모범 답안
SELECT b.time HOUR, count(ANIMAL_ID) COUNT
from (select lpad(level - 1, 2, 0) time from dual connect by level <= 24) b
inner join
ANIMAL_OUTS a
on b.time = to_char(a.DATETIME(+), 'hh24')
group by b.time
order by b.time
오라클 설명을 첨언하자면
select lpad(level - 1, 2, 0)
time from dual connect by level <= 24
시간을 정의하는 임시테이블 쿼리
on b.time = to_char(a.DATETIME(+), 'hh24')
실제 a테이블의 DATETIME에 있는지 여부를 확인하는 코드입니다.
select 다음의 칼럼은 b.time HOUR, count(ANIMAL_ID) COUNT 최종 목표값이구요.
group by order by 는 뭐 설명 생략할게요
OTL 이래도 이해가 안된다면... 그냥 저 템플릿을 쓰면 될거 같아요. 길이가 중요한게 아니라 가독성이 너무 떨어지네요. 오우 쉣...
하... 쉽지 않습니다. 양삼고백할게요. 이 쿼리는 제가 짠거 아닙니다.
쿼리도 너무 복잡해지고, 그냥 코드레 벨에서 0 값 넣어서 행렬에 추가하는 게 훨씬 나을 거 같네요.
(실무 입장이고요, 코테에선 이런 문제 내면 그냥 엿 먹으라는 소리니까 풀지 말고 다른 거 먼저 푸세요. 풀다가 말리면 다른 거 풀 시간도 없어짐)