728x90
https://leetcode.com/problems/trips-and-users/
- 문제
- 2013-10-01~2013-10-03 3일간 매일 여행 취소율을 구하라
- banned한 사람들을 제외하고
- 2013-10-01~2013-10-03 3일간 매일 여행 취소율을 구하라
- 풀이
3일간 banned 하지 않은 사람들의 여행 정보를 가져오자
SELECT STATUS
, REQUEST_AT
FROM TRIPS AS T
INNER JOIN USERS AS UC
ON T.CLIENT_ID = UC.USERS_ID
INNER JOIN USERS AS UD
ON T.DRIVER_ID = UD.USERS_ID
WHERE T.REQUEST_AT BETWEEN '2013-10-01' AND '2013-10-03'
AND UC.BANNED = 'NO' AND UD.BANNED = 'NO';
각 날짜별 전체 개수와 취소 개수를 구해보자.
CASE문을 활용해서 'COMPLETED'가 아닌 것의 수 세기
SELECT REQUEST_AT
-- 취소 개수
, SUM(CASE WHEN STATUS != 'COMPLETED' THEN 1 ELSE 0 END) AS CANCEL_COUNT
-- 전체
, COUNT(*) AS TOTAL_COUNT
FROM TRIPS AS T
INNER JOIN USERS AS UC
ON T.CLIENT_ID = UC.USERS_ID
INNER JOIN USERS AS UD
ON T.DRIVER_ID = UD.USERS_ID
WHERE T.REQUEST_AT BETWEEN '2013-10-01' AND '2013-10-03'
AND UC.BANNED = 'NO' AND UD.BANNED = 'NO'
GROUP BY REQUEST_AT;
윈도우 함수의 결과를 조건/계산 할 수 없으므로 서브쿼리를 활용하여 나누면 된다.
- 정답 코드
SELECT REQUEST_AT AS 'Day'
, ROUND(CANCEL_COUNT/TOTAL_COUNT,2) AS 'Cancellation Rate'
FROM (
SELECT REQUEST_AT
, SUM(CASE WHEN STATUS != 'COMPLETED' THEN 1 ELSE 0 END) AS CANCEL_COUNT
, COUNT(*) AS TOTAL_COUNT
FROM TRIPS AS T
INNER JOIN USERS AS UC
ON T.CLIENT_ID = UC.USERS_ID
INNER JOIN USERS AS UD
ON T.DRIVER_ID = UD.USERS_ID
WHERE T.REQUEST_AT BETWEEN '2013-10-01' AND '2013-10-03'
AND UC.BANNED = 'NO' AND UD.BANNED = 'NO'
GROUP BY REQUEST_AT
) T;
728x90
반응형
'TIL - 프로그래밍 > SQL' 카테고리의 다른 글
[프로그래머스] LV2. 물고기 종류 별 잡은 수 구하기 - MySQL (0) | 2024.05.20 |
---|---|
[리트코드] 626. Exchange Seats - MySQL (0) | 2023.07.15 |
[해커랭크] Weather Observation Station 20 - MySQL (0) | 2023.07.15 |
[해커랭크] Ollivander's Inventory - MySQL (0) | 2023.07.14 |
[해커랭크] Occupations - MySQL (0) | 2023.07.11 |
댓글