문제 출저https://leetcode.com/problems/queries-quality-and-percentage/?envType=study-plan-v2&envId=top-sql-50 문제 풀이Queries 테이블로 query_name, result, position, rating이 주어집니다. 이 열들을 조합하고 계산하여 quality와 poor_query_percetage를 구합니다. 각각의 식은 다음과 같습니다. quality : rating과 position의 비율 (rating / position)poor_query_percentage : rating이 3 미만인 쿼리의 전체 쿼리 비율 이것은 query_name별로 구하면 됩니다. 수식을 계산하기 위해 avg, sum, if, c..
문제 출저https://leetcode.com/problems/percentage-of-users-attended-a-contest/?envType=study-plan-v2&envId=top-sql-50 문제 풀이각 콘테스트에 등록된 사용자 비율을 소수점 이하 두 자리로 표현해야 합니다. Register 테이블에 contest_id를 group by로 그룹화하여 각 콘테스트 별로 참여한 유저의 수를 구합니다. Users에서 전체 유저 갯수를 구합니다. 전체 유저 갯수를 나누어 비율을 구하고 round를 통해 소수점 이하 두 자리로 표현합니다. SQL# 각 콘테스트에 등록된 사용자 비율을 소수점 이하 두 자리 반올림 select r.contest_id, round( count(u.u..
문제 출저https://leetcode.com/problems/project-employees-i/description/?envType=study-plan-v2&envId=top-sql-50 문제 풀이각 프로젝트에 대해 모든 직원의 평균 경력 연수를 두 자리 숫자로 반올림하여 조회합니다. 프로젝트 별로 계산을 진행합니다. 그러므로 project를 기준으로 left join 하여 employee 테이블을 관계를 맺습니다. group by, average로 프로젝트 별 평균 연령을 구합니다.round 사용하여 두 자리 숫자로 반올림합니다. SQL# 각 프로젝트에 대한 모든 직원의 평균 경력 연수를 # 두 자리 숫자로 반올림하여 조회select p.project_id, round(avg(..
문제 출저https://leetcode.com/problems/average-selling-price/description/?envType=study-plan-v2&envId=top-sql-50 문제 풀이각 제품의 평균 판매 금액을 구해야 합니다. Prices 테이블에는 날짜 범위에 해당하는 가격이 UnitsSold 테이블에는 상품, 판매날짜, 갯수가 표시되어 있습니다. Prices와 UnitsSold를 left join 합니다. 조인 조건은 product_id 같은 것, 그리고 Between을 이용해 판매 날짜가 Prices의 날짜 사이에 있도록 합니다. sum(price * units)을 통해 전체 금액과 sum(units)을 통해 총 판매량을 구하고 전체 금액에서 총 판매량을 나누어 평균을 ..
문제 출저https://leetcode.com/problems/not-boring-movies/description/?envType=study-plan-v2&envId=top-sql-50 문제 풀이ID가 홀수이고 description이 boring이 아닌 것을 선택하고 rating을 기준으로 내림차순 정렬하는 SQL을 작성해야 합니다. where 절을 이용해 id % 2 = 1 홀수를 선택합니다. description != 'boring' 으로 boring이 아닌 것을 선택합니다.order by rating desc를 이용해 내림차순 정렬을 합니다. SQL# id가 홀수이고 boring이 아닌 것 선택# rating 기준 내림차select id, movie, descripti..
문제 출저https://leetcode.com/problems/confirmation-rate/?envType=study-plan-v2&envId=top-sql-50 문제 풀이각 유저의 확인 비율을 구해야 합니다. 확인 비율은 확인(confirmed) / 전체 메일 입니다. 모든 유저를 나타내기 위해서 left join을 합니다. Singups, Confirmations 조인하여 user_id로 그룹화 합니다. 집계함수 sum과 조건문 if를 이용하여 confirmed의 갯수를 구합니다.count를 통해 전체 갯수를 구합니다.round를 통해 소수점 2자리를 표시하도록 합니다. SQLselect s.user_id, round(sum(if(c.action = 'confirmed', ..
문제 출저https://leetcode.com/problems/managers-with-at-least-5-direct-reports/description/?envType=study-plan-v2&envId=top-sql-50 문제 풀이5명 이상의 직속 부하가 있는 직원의 이름을 출력해야 합니다. Employee 테이블을 id와 managerId로 조인합니다.manager.id를 그룹화하고 having으로 5개 이상을 선택합니다. SQL-- # 5명 이상의 직속 부하가 있는 직원의 이름을 출력한다. 이름이 중복될 수 있다. select manager.name from Employee as managerjoin Employee as employee on manager.id =..
문제 출저https://leetcode.com/problems/students-and-examinations/description/?envType=study-plan-v2&envId=top-sql-50 문제 풀이각 학생이 시험을 몇 번 참석했는지 구해야 합니다. cross join으로 Students와 Subject를 연결시켜 각 학생이 시험을 참여한 모든 경우의 수를 구합니다.left join으로 Examinations와 연결합니다.group by로 student_id, subject_name 그룹화하여 count를 통해 갯수를 셉니다.order by로 student_id, subject_name 순서로 정렬시킵니다. SQL-- select * -- from Students -- cross j..
문제 출저https://leetcode.com/problems/employee-bonus/?envType=study-plan-v2&envId=top-sql-50 문제 풀이보너스가 1000 미만인 직원의 name, bonus를 출력해야 합니다. Employee 테이블에서 name을 Bonus 테이블에서 bonus를 가져와야 하므로 JOIN을 사용합니다.where 절을 사용하여 보너스가 1000 미만인 직원을 찾습니다. 이 때, null 또한 1000 미만이므로 포함시킵니다. SQL# 보너스가 1000보다 적은 사람 # 보너스가 NULL인 사람이 있으니 NULL을 포함시킵니다. select e.name, b.bonusfrom Employee as e left join Bonus ..
문제 출저https://leetcode.com/problems/average-time-of-process-per-machine/?envType=study-plan-v2&envId=top-sql-50 문제 풀이각 기계가 프로세스를 완료하는데 걸리는 평균 시간을 구해야 합니다. 완료하는데 걸리는 시간은 종료 시간에서 시작 시간을 뺀 값 입니다. (완료 시간 = 종료 시간 - 시작 시간)평균 시간은 소수점 이하 3자리로 표현합니다. s, ,e 테이블 2개를 조인합니다. machine_id, process_id 동일하게 조인합니다. s 테이블은 시작 시각을 나타내고 e 테이블은 종료 시간을 나타냅니다.avg(e.timestamp - s.timestamp)를 통해 평균을 구합니다. round를 통해 소수점 이..
문제 출저https://leetcode.com/problems/rising-temperature/?envType=study-plan-v2&envId=top-sql-50 문제 풀이어제랑 비교해서 온도가 더 높은 id를 출력하는 문제입니다. 한 테이블에서 오늘과 어제를 비교해야 하므로 내부 조인을 수행합니다. 저는 오늘 날짜 today, 어제 날짜는 yesterday 라는 이름으로 테이블을 설정했습니다. 조인 조걸은 날짜 차이를 1로 설정하여 오늘과 어제를 비교합니다.where 절을 통해 today의 recordDate가 yesterday의 recordDate 보다 크다는 조건을 넣어 today가 항상 앞서도록 했습니다. SQL# 어제랑 비교해서 온도가 더 높은 id룰 출력해야 합니다. selec..
문제 출저https://leetcode.com/problems/customer-who-visited-but-did-not-make-any-transactions/?envType=study-plan-v2&envId=top-sql-50 문제 풀이거래 없이 방문한 사용자의 아이디와 방문 횟수를 구해야 합니다.Transactions 테이블에 방문 아이디를 가져옵니다. Visits 테이블에서 가져온 아이디에 일치하는게 없으면 거래 없이 방문한 것 입니다. whrere에 not in 을 사용합니다. customer_id 별로 횟수를 구해야 하므로 group by를 사용합니다. SQL# 거래 없이 방문한 사용자의 아이디와 방문 횟수를 구해야 한다. select customer_id, count..