https://school.programmers.co.kr/learn/courses/30/lessons/59413
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
VER 3.0
SELECT A.HOUR AS HOUR , COUNT(B.ANIMAL_TYPE) AS COUNT FROM
(SELECT LEVEL -1 AS HOUR FROM DUAL
CONNECT BY LEVEL <=24 ) A
LEFT JOIN ANIMAL_OUTS B ON
TO_CHAR(DATETIME , 'HH24') = A.HOUR
GROUP BY HOUR
ORDER BY A.HOUR
==> LEFT JOIN ==> CONNECT BY LEVEL
SELECT A.HOUR , COUNT(B.ANIMAL_ID) AS COUNT FROM
(SELECT LEVEL-1 AS HOUR FROM DUAL
CONNECT BY LEVEL<=24) A
FULL OUTER JOIN ANIMAL_OUTS B
ON A.HOUR = TO_CHAR(DATETIME , 'HH24')
GROUP BY A.HOUR
ORDER BY HOUR
VER 1.0
1. CONNECT BY LEVEL 절 연습!!!
SELECT LEVEL AS NO FROM DUAL
CONNECT BY LEVEL <=10
2. 2023년 12월까지의 열 생성해봐라!
SELECT '2023 년 '||LPAD(LEVEL,2,0)||'월' AS YEAR
FROM DUAL
CONNECT BY LEVEL <=12
==> LPAD(변수, 2칸, 남은칸숫자(0)넣기)
3. 특정 구간의 날짜 찾기
SELECT TO_DATE('20221001', 'YYYYMMDD') + (LEVEL-1) AS DT
FROM DUAL
CONNECT BY LEVEL <= (TO_DATE('20221011', 'YYYYMMDD') - TO_DATE('20221001', 'YYYYMMDD')) +1
4. 최종실습
SELECT A.HOUR AS HOUR, COUNT(B.ANIMAL_TYPE) AS COUNT FROM
(SELECT DISTINCT (LEVEL-1) AS HOUR FROM ANIMAL_OUTS
CONNECT BY LEVEL <= 24
) A
LEFT JOIN ANIMAL_OUTS B
ON TO_CHAR(DATETIME,'HH24') = A.HOUR
GROUP BY HOUR
ORDER BY HOUR
==> CONNECT BY LEVEL <= 24를 통해 1부터 24까지의 LEVEL 변수 생성
==> A 테이블에 0부터 23까지의 열 이 생성되었다.
==>ANIMAL_OUTS(B) 테이블을 A테이블에 LEFT JOIN한다. ==> DATETIME의 24시간제(HH24) 와 A테이블(0~23)이 일치하는 것들을 머리를 집어넣는다.
==> COUNT(ANIMAL_OUTS(B)) ==> GROUP 으로 HOUR간 정렬이 완료가 된다. COUNT가 가능해진다.
VER 2.0 FROM 절 서브쿼리문 활용
SELECT A.HOUR , NVL(B.COUNT , 0) AS COUNT FROM
(SELECT LEVEL-1 AS HOUR FROM DUAL
CONNECT BY LEVEL<=24) A FULL OUTER JOIN (
SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) AS HOUR , COUNT(*) AS COUNT FROM ANIMAL_OUTS
GROUP BY TO_NUMBER(TO_CHAR(DATETIME, 'HH24'))
) B ON A.HOUR = B.HOUR
ORDER BY HOUR
===================================
-- 코드를 입력하세요
-- SELECT TO_NUMBER(TO_CHAR(DATETIME , 'HH')) AS HOUR, COUNT(*) FROM ANIMAL_OUTS
-- GROUP BY TO_CHAR(DATETIME , 'HH')
-- ORDER BY HOUR
-- SELECT TO_CHAR(DATETIME , 'HH24') AS HOUR , COUNT(*) AS COUNT FROM ANIMAL_OUTS
-- GROUP BY TO_CHAR(DATETIME , 'HH24')
-- ORDER BY HOUR
-- SELECT A.HOUR AS HOUR, COUNT(B.ANIMAL_TYPE) AS COUNT FROM
-- (SELECT DISTINCT (LEVEL-1) AS HOUR FROM ANIMAL_OUTS
-- CONNECT BY LEVEL <= 24
-- ) A
-- LEFT JOIN ANIMAL_OUTS B
-- ON TO_CHAR(DATETIME,'HH24') = A.HOUR
-- GROUP BY HOUR
-- ORDER BY HOUR
-- SELECT LEVEL AS NO FROM DUAL
-- CONNECT BY LEVEL <=10
-- SELECT '2023 년 ' ||LPAD(LEVEL, 2, 0)||'월' AS NO
-- FROM DUAL
-- CONNECT BY LEVEL <=12
-- SELECT '2023 년 '||LPAD(LEVEL,2,0)||'월' AS YEAR
-- FROM DUAL
-- CONNECT BY LEVEL <=12
-- SELECT TO_DATE('20221001', 'YYYYMMDD') + (LEVEL-1) AS DT
-- FROM DUAL
-- CONNECT BY LEVEL <= (TO_DATE('20221011', 'YYYYMMDD') - TO_DATE('20221001', 'YYYYMMDD')) +1
SELECT A.HOUR , NVL(B.COUNT , 0) AS COUNT FROM
(SELECT LEVEL-1 AS HOUR FROM DUAL
CONNECT BY LEVEL<=24) A FULL OUTER JOIN (
SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) AS HOUR , COUNT(*) AS COUNT FROM ANIMAL_OUTS
GROUP BY TO_NUMBER(TO_CHAR(DATETIME, 'HH24'))
) B ON A.HOUR = B.HOUR
ORDER BY HOUR
'SQL > GROUP BY' 카테고리의 다른 글
[프로그래머스 ORACLE SQL]경기도에 위치한 식품창고 목록 출력하기★LIKE★NVL★VER 2.0★ (0) | 2023.01.04 |
---|---|
[프로그래머스 ORACLE SQL]가격대별 상품개수★SUBSTR(열, 자를거 시작위치 , 자를거 끝 위치)★RPAD (0) | 2023.01.04 |
[프로그래머스 ORACLE SQL]년, 월, 성별 별 상품 구매 회원 수 구하기★INNER JOIN★ (0) | 2023.01.04 |
★WHERE 절 서브쿼리★LPAD★[프로그래머스 ORACLE SQL]즐겨찾기가 많은 식당 출력 (0) | 2023.01.04 |
[프로그래머스 ORACLE SQL]입양 시각 구하기(1)★BETWEEM★HH24 (0) | 2022.10.28 |