_Han_
나의 개발 노트
_Han_
  • 분류 전체보기 (272)
    • 데이터 엔지니어링 (29)
    • 인프라 (3)
    • 추천시스템 (11)
    • 코딩테스트 (146)
    • 부트캠프 회고 (15)
    • 회고 (4)
    • 자격증 (1)
    • 파이썬 프로그래밍 (6)
    • 통계 (2)
    • Git (21)
    • 유니티2D (33)

최근 글

반응형
hELLO · Designed By 정상우.
_Han_

나의 개발 노트

[코딩테스트] 프로그래머스 입양 시각 구하기(2) MySQL
코딩테스트

[코딩테스트] 프로그래머스 입양 시각 구하기(2) MySQL

2022. 12. 9. 14:46
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/59413

 

프로그래머스

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

programmers.co.kr

SET @HOUR = -1;
SELECT HOUR_TABLE.HOUR AS HOUR, IFNULL(OUTS.COUNT, 0) AS COUNT
FROM (SELECT (@HOUR := @HOUR + 1) AS HOUR
      FROM ANIMAL_OUTS
      WHERE @HOUR < 23) AS HOUR_TABLE
LEFT JOIN (SELECT HOUR(DATETIME) AS HOUR, (COUNT(HOUR(DATETIME))) AS COUNT
      FROM ANIMAL_OUTS
      GROUP BY HOUR(DATETIME)) AS OUTS
ON OUTS.HOUR = HOUR_TABLE.HOUR

위에는 정답코드입니다.

 

오답코드를 통하여 정답코드를 도출하도록 하겠습니다.

먼저 단순하게 GROUP BY를 써서 문제를 해결할 수 있겠다는 생각으로 GROUP BY로 진행을 해보았습니다.

SELECT HOUR(DATETIME) AS HOUR, COUNT(HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME)

위의 오답코드로 출력을 해보았을때 결과는 아래와 같았습니다.

저희는 HOUR가 0~23의 값이 필요하지만 7~19까지의 값만 존재하는 것을 확인할 수 있습니다.

 

그래서 SET 명령어를 사용하여 @HOUR 변수를 만들어서 문제를 해결했습니다.

SET @HOUR = 0;
SELECT (@HOUR := @HOUR +1) AS HOUR
FROM ANIMAL_OUTS

위의 코드를 실행하면 아래와 같이 총 100개의 행이 생성이됩니다.

100개의 행을 모두 담으면 사진이 너무 커져 18까지만 가져왔습니다.

100개의 행이 생성이 되는 이유는 아래와 같이 ANIMAL_OUTS 테이블이 총 100개의 행을 가지고 있기 때문입니다.

SELECT COUNT(*)
FROM ANIMAL_OUTS

 

저는 0~100까지의 행이아니라 0~23까지의 행이 필요하기 때문에 코드를 아래와 같이 수정했습니다.

SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS HOUR
FROM ANIMAL_OUTS
WHERE @HOUR < 23

0~23까지의 행을 구하였고 이렇게 만든 테이블과 위에서 구한 GROUP BY만든 ANIMAL_OUTS 테이블을 LEFT JOIN을 하였습니다.

SET @HOUR = -1;
SELECT HOUR_TABLE.HOUR, OUTS.COUNT
FROM (SELECT (@HOUR := @HOUR + 1) AS HOUR
     FROM ANIMAL_OUTS
     WHERE @HOUR < 23) AS HOUR_TABLE
LEFT JOIN (SELECT HOUR(DATETIME) AS HOUR,
           COUNT(HOUR(DATETIME)) AS COUNT
           FROM ANIMAL_OUTS
           GROUP BY HOUR(DATETIME)) AS OUTS
ON HOUR_TABLE.HOUR = OUTS.HOUR

위의 코드를 실행시킨 결과입니다.

HOURS 컬럼은 0~23값을 가지고 있고 COUNT 컬럼은 NULL값이 존재하는 것을 확인할 수 있습니다.

마지막으로 IFNULL()함수를 사용하여 NULL값은 0으로 대체하여 문제를 해결하였습니다.

 

반응형

'코딩테스트' 카테고리의 다른 글

[코딩테스트] 프로그래머스 오프라인/온라인 판매 데이터 통합하기 MySQL  (0) 2022.12.12
[코딩테스트] 프로그래머스 그룹별 조건에 맞는 식당 목록 출력하기 MySQL  (0) 2022.12.10
[코딩테스트] 프로그래머스 주문량이 많은 아이스크림들 조회하기  (0) 2022.12.09
[코딩테스트] 프로그래머스 취소되지 않은 진료 예약 조회하기 MySQL  (0) 2022.12.08
[코딩테스트] 프로그래머스 년, 월, 성별 별 상품 구매 회원 수 구하기 MySQL  (0) 2022.12.08
    '코딩테스트' 카테고리의 다른 글
    • [코딩테스트] 프로그래머스 오프라인/온라인 판매 데이터 통합하기 MySQL
    • [코딩테스트] 프로그래머스 그룹별 조건에 맞는 식당 목록 출력하기 MySQL
    • [코딩테스트] 프로그래머스 주문량이 많은 아이스크림들 조회하기
    • [코딩테스트] 프로그래머스 취소되지 않은 진료 예약 조회하기 MySQL
    _Han_
    _Han_
    학습한 것을 기록합니다.

    티스토리툴바