SQL/GROUP BY

[프로그래머스 ORACLE SQL]입양 시각 구하기(2)★FULL OUTER JOIN★CONNECT BY LEVEL절 실습!!!!★VER3.0

goAhEAd_29 2023. 1. 4. 14:26
728x90
반응형

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

 

 

728x90
반응형