LeetCode에서 SQL50 문제들을 풀어보았습니다.
이번 글에서는 SQL50 문제 중 Basic Aggregate Functions 8개를 풀어보겠습니다.
각 문제의 설명과 함께 SQL 풀이 코드를 제공하니, 차근차근 따라와 보세요! 🚀
아래는 해당 문제를 풀어볼 수 있는 링크입니다!
https://leetcode.com/studyplan/top-sql-50
📝620. Not Boring Movies
🔹 지루하지 않은 영화
홀수 ID와 "boring"이 아닌 설명이 포함된 영화를 신고하는 솔루션을 작성하세요.
등급별로 내림차순으로 정렬된 결과 테이블을 반환합니다.
🔍 문제 설명
- id가 홀수인 영화 조회
- description이 "boring"이 아닌 영화만 선택
- 결과를 rating 기준 내림차순 정렬
✅ SQL 풀이
SELECT *
FROM Cinema
WHERE id % 2 = 1
AND description != 'boring'
ORDER BY rating DESC
📝1251. Average Selling Price
🔹 평균 판매 가격
각 제품의 평균 판매 가격을 구하는 해를 작성하세요.
average_price는 소수점 이하 2자리로 반올림되어야 합니다.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- 각 product_id의 평균 판매 가격을 계산
- price * units 값을 기준으로 가중 평균을 구함
- average_price는 소수점 2자리까지 반올림
- 제품이 판매되지 않았다면 0 반환
✅ SQL 풀이
SELECT a.product_id
, IFNULL(ROUND(SUM(a.price * b.units) / sum(b.units), 2), 0) AS average_price
FROM Prices a
LEFT JOIN UnitsSold b
ON a.product_id = b.product_id
AND b.purchase_date BETWEEN a.start_date AND a.end_date
GROUP BY a.product_id
📝1075. Project Employees 1
🔹 프로젝트 직원 1
각 프로젝트에 대한 모든 직원의 평균 경력 연수를 두 자리 숫자로 반올림하여 보고하는 SQL 쿼리를 작성합니다.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- 각 project_id별로 참여한 직원들의 experience_years 평균 계산
- 평균값은 소수점 이하 2자리 반올림
- 결과 테이블의 순서는 상관없음
✅ SQL 풀이
SELECT a.project_id
, ROUND(AVG(b.experience_years), 2) AS average_years
FROM Project a
LEFT JOIN Employee b
ON a.employee_id = b.employee_id
GROUP BY a.project_id
반응형
📝1633. Percentage of Users Attended a Contest
🔹 콘테스트에 참석한 사용자 비율
각 콘테스트에 등록된 사용자의 비율을 소수점 이하 두 자리까지 반올림하여 구하는 솔루션을 작성하세요.
백분율 기준으로 내림차순으로 정렬된 결과 테이블을 반환합니다.
동점인 경우에는 Contest_id순으로 오름차순으로 정렬합니다.
🔍 문제 설명
- 각 contest_id별로 참석한 사용자 수 계산
- 전체 사용자 수 대비 참석 비율을 구하여 소수점 2자리 반올림
- percentage 기준 내림차순 정렬, 동률일 경우 contest_id 오름차순 정렬
✅ SQL 풀이
SELECT contest_id
, ROUND((COUNT(user_id) / (SELECT count(user_id) FROM Users)) * 100, 2) AS percentage
FROM Register
GROUP BY contest_id
ORDER BY percentage DESC
, contest_id
📝1211. Queries Quality and Percentage
🔹 쿼리 품질 및 백분율
쿼리 품질을 다음과 같이 정의합니다.
- 쿼리 평점과 해당 위치 간의 비율 평균입니다.또한 불량한 쿼리 비율을 다음과 같이 정의합니다.
- 등급이 3 미만인 모든 쿼리의 비율입니다.각각의 query_name, 품질 및 Poor_query_percentage를 찾는 솔루션을 작성하세요. quality와 Poor_query_percentage는 모두 소수점 이하 2자리로 반올림되어야 합니다.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- quality = rating / position의 평균값
- poor_query_percentage = rating < 3인 쿼리의 비율
- query_name 기준으로 그룹화
- 두 값 모두 소수점 2자리 반올림
✅ SQL 풀이
SELECT query_name
, ROUND(AVG(rating / position), 2) AS quality
, ROUND((COUNT(CASE WHEN rating < 3 THEN query_name END) / COUNT(0)) * 100, 2) AS poor_query_percentage
FROM Queries
WHERE query_name IS NOT NULL
GROUP BY query_name
📝1193. Monthly Transactions 1
🔹 월별 거래 1
월별, 국가별로 거래 건수와 총액, 승인된 거래 건수와 총액을 찾는 SQL 쿼리를 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- month(YYYY-MM 형식) 및 country별로 그룹화
- 승인된 거래(state = 'approved') 건수 및 금액 계산
- 승인되지 않은 거래는 0으로 처리
✅ SQL 풀이
SELECT DATE_FORMAT(trans_date, '%Y-%m') AS month
, country
, COUNT(*) AS trans_count
, COUNT(CASE WHEN state = 'approved' THEN id END) AS approved_count
, SUM(amount) AS trans_total_amount
, IFNULL(SUM(CASE WHEN state = 'approved' THEN amount END), 0) AS approved_total_amount
FROM Transactions
GROUP BY month
, country
728x90
📝1174. Immediate Food Delivery 2
🔹 즉각적인 음식배달 2
고객이 원하는 배송 날짜가 주문 날짜와 동일하면 즉시 주문이 호출됩니다. 그렇지 않으면 예정이라고 합니다.
고객의 첫 번째 주문은 고객이 주문한 날짜가 가장 빠른 주문입니다. 고객이 정확히 한 번의 첫 번째 주문을 한다는 것이 보장됩니다.
모든 고객의 첫 번째 주문에서 즉시 주문의 비율을 소수점 이하 2자리까지 반올림하여 구하는 솔루션을 작성하세요.
🔍 문제 설명
- 고객의 첫 주문일(first_order)을 구함
- order_date = customer_pref_delivery_date인 건수를 계산
- 전체 첫 주문 중 즉시 배달 비율을 소수점 2자리 반올림
✅ SQL 풀이
SELECT ROUND((COUNT(CASE WHEN order_date = customer_pref_delivery_date THEN delivery_id END) / COUNT(*)) * 100, 2) AS immediate_percentage
FROM Delivery
WHERE (customer_id, order_date) IN (
SELECT customer_id
, MIN(order_date) AS first_order
FROM Delivery
GROUP BY customer_id
)
📝550. Game Play Analysis 4
🔹 게임 플레이 분석 4
처음 로그인한 날 다음 날 다시 로그인한 플레이어의 비율을 소수점 이하 2자리로 반올림하여 보고하는 솔루션을 작성하세요.
즉, 첫 번째 로그인 날짜부터 최소 2일 연속으로 로그인한 플레이어 수를 계산한 다음 해당 숫자를 전체 플레이어 수로 나누어야 합니다.
🔍 문제 설명
- 각 player_id별 첫 로그인 날짜를 찾음
- 다음 날(+1 day) 로그인한 기록이 있는 플레이어 수 계산
- 전체 플레이어 중 연속 로그인 비율을 구하여 소수점 2자리 반올림
✅ SQL 풀이
WITH login_info AS (
SELECT player_id
, DATEDIFF(event_date, MIN(event_date) OVER(PARTITION BY player_id)) = 1 AS next_login
FROM Activity
)
SELECT ROUND(SUM(next_login) / COUNT(DISTINCT player_id), 2) AS fraction
FROM login_info;
728x90
반응형
'LeetCode' 카테고리의 다른 글
[LeetCode SQL50] - Subqueries 문제풀이 (0) | 2025.02.19 |
---|---|
[LeetCode] SQL50 - Advanced Select and Joins 문제풀이 (0) | 2025.02.18 |
[LeetCode] SQL50 - Sorting and Grouping 문제풀이 (0) | 2025.02.17 |
[LeetCode] SQL50 - Basic Joins 문제풀이 (0) | 2025.02.13 |
[LeetCode] SQL50 - Select 문제풀이 (0) | 2025.02.12 |