본문 바로가기

[LeetCode] SQL50 - Basic Aggregate Functions 문제풀이

by qwee0328 2025. 2. 13.

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
반응형