반응형
CONNECT BY : 계층형 쿼리이지만, LEVEL로 사용해서 0~N의 값을 출력해서 FOR문 처럼 사용할 수 있다.
예제) 0~15까지 출력하기
SELECT LEVEL-1 AS HOUR
FROM DUAL
CONNECT BY LEVEL <= 16
결과
hour
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
위와 같은 결과가 나옵니다.
활용!
* 프로그래머스에서 나왔던 "입양 시각 구하기(2)"문제를 CONNECT BY를 이용해서 풀어보자
SELECT A.HOUR
, NVL(B.COUNT,0) AS COUNT
FROM (SELECT LEVEL-1 AS HOUR
, 0 AS COUNT
FROM DUAL
CONNECT BY LEVEL <= 24) A
LEFT OUTER JOIN (SELECT to_number(to_char(datetime,'hh24')) AS HOUR
, COUNT(to_number(to_char(datetime,'hh24'))) AS COUNT
FROM ANIMAL_OUTS
GROUP BY to_number(to_char(datetime,'hh24'))
ORDER BY HOUR ASC) B
ON A.HOUR = B.HOUR
ORDER BY A.HOUR ASC
;
-> 0~23 시간을 출력해야 하므로 CONNECT LEVEL을 이용해서 0~23을 출력했습니다.
-> 그 후 ANIMAL_OUTS 테이블에서 각 시간마다 입양 보낸 카운트 값을 구하고 조인을 시켜
대조 하면서 각 시간마다 건수를 출력합니다.
결과
hour count
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 3
8 1
9 1
10 2
11 13
12 10
13 14
14 9
15 7
16 10
17 12
18 16
19 2
20 0
21 0
22 0
23 0
위와 같은 결과가 나옵니다.
제가 생각한 방법은 이 쿼리지만, 좀 더 간편하게 작성 하는 분들도 있으니 참고만 해주세요 ㅎㅎ
300x250
'Programming_Language > Oracle_Sql' 카테고리의 다른 글
[Procedure] 프로시저란? (0) | 2023.07.04 |
---|---|
[Oracle] LPAD, RPAD 함수 사용하기 (공백 채우기) (0) | 2023.06.26 |
[Oracle] ROWNUM 대신 FETCH (0) | 2023.06.15 |