알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/parts/17044

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

동명 동물 수 찾기

입양 시각 구하기(1)

입양 시각 구하기(2)


Think🤔

마지막 문제가 간단 X


Solution✍
-- HAVING 하고 WHERE의 차이점
-- HAVING은 GROUP BY 하고난 뒤 , WHERE 그 이전 전체 데이터 검색
-- 코드를 입력하세요
SELECT NAME,COUNT(NAME) AS COUNT 
FROM ANIMAL_INS 
GROUP BY NAME 
HAVING COUNT > 1 
   AND NAME IS NOT NULL 
ORDER BY NAME;
-- TO_CHAR 이용해서 BETWEEN
-- GROUP BY 할 때, AS조건으로 넣으면 안들어가짐 , 조건 같이 넣어야함
-- HAVING절을 이용해서 가공된 시간 BETWEEN 걸어서 사이에 넣기
SELECT TO_CHAR(DATETIME,'HH24') AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME,'HH24')
HAVING TO_CHAR(DATETIME,'HH24') BETWEEN '09' AND '20'
ORDER BY HOUR;
-- 정답 [ X ] 
-- 마지막 문제 쿼리는 LEVEL 쿼리로 만들어주거나 조인 사용해야 함
SELECT TO_CHAR(DATETIME,'HH24') AS HOUR ,
       COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME,'HH24')
HAVING TO_CHAR(DATETIME,'HH24') BETWEEN '00' AND '23'
ORDER BY HOUR;
-- 서브쿼리 임시테이블 만듬
-- tmp 임시테이블을 만드는데 레벨 0부터 23까지 줌
with tmp as (
    select level-1 as hour
      from dual
   connect by level < 25 
)
select * from tmp;

위의 쿼리로 조회를 하면 0~23까지 나옴

-- 정답 [ O ] 
with tmp as (
    select level-1 as hour
      from dual
   connect by level < 25 
)

select a.hour
     , nvl(b.count, 0)
  from tmp a
  left outer join
     (
        select to_char(datetime, 'HH24')    as hour
             , count(*)                     as count
          from animal_outs
         group by to_char(datetime, 'HH24')
     ) b
    on a.hour = b.hour
 order by a.hour
;


-- SELECT * FROM animal_outs WHERE to_char(datetime, 'HH24') = '07';
-- 조회가 가능하므로 조인절 해당 조건으로 준다.

그 다음 nvl이용해서 count없으면 0으로 중복이 있으면 안되므로 tmp에 left outer join을 걸어줌


Review🤩

select로 모두 union all 해서 푼 사람도 있음 

union 중복되는거 없애줌

union all 전부이고 속도 더 빠름


 

+ Recent posts