본문 바로가기

[LeetCode] SQL50 - Advanced Select and Joins 문제풀이

by qwee0328 2025. 2. 18.

LeetCode에서 SQL50 문제들을 풀어보았습니다.

이번 글에서는 SQL50 문제 중 Advanced Select and Joins 7개를 풀어보겠습니다.
각 문제의 설명과 함께 SQL 풀이 코드를 제공하니, 차근차근 따라와 보세요! 🚀

아래는 해당 문제를 풀어볼 수 있는 링크입니다!

 

https://leetcode.com/studyplan/top-sql-50

 


 

📝 1731. The Number of Employees Which Report to Each Employee

🔹 각 직원에게 보고하는 직원 수

이 문제에서는 관리자를 자신에게 보고하는 다른 직원이 1명 이상 있는 직원으로 간주합니다.
모든 관리자의 ID와 이름, 그들에게 직접 보고하는 직원 수, 보고서의 평균 연령을 가장 가까운 정수로 반올림하여 보고하는 솔루션을 작성하세요.
Employee_id별로 정렬된 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

 

  • 관리자는 자신에게 보고하는 직원이 1명 이상인 직원
  • 관리자의 ID, 이름, 보고받는 직원 수, 보고서 평균 연령 계산
  • 결과 테이블은 employee_id 기준으로 정렬

 

✅ SQL 풀이

    SELECT b.employee_id
         , b.name
         , COUNT(a.reports_to) AS reports_count
         , ROUND(AVG(a.age)) AS average_age
      FROM Employees a
INNER JOIN Employees b
        ON a.reports_to = b.employee_id
  GROUP BY b.employee_id
  ORDER BY b.employee_id

 

 

 


 

📝 1789. Primary Department for Each Employee

🔹 직원별 주요 부서

직원은 여러 부서에 속할 수 있습니다. 직원이 다른 부서에 합류할 때 어떤 부서가 자신의 기본 부서인지 결정해야 합니다. 직원이 하나의 부서에만 속해 있는 경우 기본 열은 'N'입니다.
모든 직원을 주 부서로 보고하는 솔루션을 작성하세요. 한 부서에 소속된 직원의 경우 해당 부서만을 보고합니다.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

 

  • 직원이 하나의 부서에만 속한 경우 해당 부서만 출력
  • 기본 부서(primary_flag = 'Y')가 있는 경우 해당 부서 출력
  • 결과 테이블은 정렬 조건 없음

 

✅ SQL 풀이

  SELECT employee_id
       , department_id 
    FROM Employee
GROUP BY employee_id
  HAVING COUNT(0) = 1
   UNION
  SELECT employee_id
       , department_id 
    FROM Employee
   WHERE primary_flag = 'Y'
ORDER BY 1

 

 

 

반응형

 

📝 610. Triangle Judgement

🔹  삼각심판

세 개의 선분마다 삼각형을 형성할 수 있는지 보고합니다.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

 

  • 세 변의 길이를 사용하여 삼각형 성립 여부 판단
  • 삼각형 성립 조건: 가장 긴 변의 길이가 나머지 두 변의 합보다 작아야 함
  • 결과 테이블은 정렬 조건 없음

 

✅ SQL 풀이

SELECT *
     , CASE WHEN z >= x AND z >= y AND x + y > z THEN 'Yes'
            WHEN x >= y AND x >= z AND y + z > x THEN 'Yes'
            WHEN y >= x AND y >= z AND x + z > y THEN 'Yes'
       	    ELSE 'No'
       END AS triangle
  FROM Triangle

 

 

 


 

📝 180. Consecutive Numbers

🔹 연속된 숫자

연속해서 3번 이상 나타나는 숫자를 모두 찾아보세요.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

 

  • 동일한 숫자가 3번 이상 연속으로 등장하는 경우 찾기
  • WITH 문을 활용하여 다음 두 개의 값과 비교
  • 결과 테이블은 정렬 조건 없음

 

✅ SQL 풀이

WITH next_logs AS (
    SELECT *
         , CASE WHEN (id + 1) = LEAD(id) OVER(ORDER BY id) 
                THEN LEAD(num) OVER(ORDER BY id) 
           END AS next1
         , CASE WHEN (id + 2) = LEAD(id, 2) OVER(ORDER BY id) 
                THEN LEAD(num, 2) OVER(ORDER BY id) 
           END AS next2
      FROM Logs
) 
SELECT DISTINCT num AS ConsecutiveNums
  FROM next_logs
 WHERE num = next1
   AND next1 = next2

 

 

 

728x90

 

📝 1164. Product Price at a Given Date

🔹 특정 날짜의 제품 가격

2019-08-16에 모든 제품의 가격을 구하는 솔루션을 작성하세요. 변경 전 모든 제품의 가격이 10이라고 가정합니다.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

 

  • 특정 날짜(2019-08-16) 기준으로 제품 가격 조회
  • 변경 기록이 없는 경우 기본 가격(10) 반환
  • 결과 테이블은 정렬 조건 없음

 

✅ SQL 풀이

WITH max_price AS (
  	  SELECT product_id
     	   , MAX(change_date) AS max_change
    	FROM Products
  	   WHERE change_date <= '2019-08-16' 
	GROUP BY product_id
),
product_distinct AS (
	SELECT DISTINCT product_id
      FROM Products
)
   SELECT a.product_id
        , IFNULL(c.new_price, 10) AS price
     FROM product_distinct AS a
LEFT JOIN max_price AS b
       ON a.product_id = b.product_id
LEFT JOIN Products c
       ON a.product_id = c.product_id
      AND b.max_change = c.change_date
 ORDER BY 1

 

 

 


 

📝 1204. Last Person to Fit in the Bus

🔹 버스에 마지막으로 탑승한 사람

버스를 타기 위해 사람들이 줄을 서고 있습니다. 다만, 버스의 무게 제한은 1000kg이므로 탑승하지 못하는 분들도 있을 수 있습니다.
무게 제한을 초과하지 않고 버스에 탑승할 수 있는 마지막 사람의 person_name을 찾는 솔루션을 작성하세요. 첫 번째 사람이 무게 제한을 초과하지 않도록 테스트 케이스가 생성됩니다.

 

 

🔍 문제 설명

  • 탑승자의 총 무게가 1000kg을 초과하지 않는 선에서 마지막으로 탑승한 사람 찾기
  • SUM(weight) OVER(ORDER BY turn)을 활용하여 누적 무게 계산
  • 결과 테이블은 정렬 조건 없음

 

✅ SQL 풀이

   SELECT person_name
     FROM (
            SELECT person_name
                 , SUM(weight) OVER(ORDER BY turn) AS total_weight
              FROM Queue
          ) a
    WHERE total_weight <= 1000
 ORDER BY total_weight DESC
    LIMIT 1

 

 


 

📝 1907. Count Salary Categories

🔹 급여 범주 계산

각 급여 항목에 대한 은행 계좌 수를 계산하는 해를 작성하세요. 급여 카테고리는 다음과 같습니다.
  • Low Salary: 모든 급여가 $20000 미만입니다.
  • Average Salary: 포함 범위 [$20000, $50000]의 모든 급여입니다.
  • High Salary: 모든 급여가 $50000보다 엄격합니다.
결과 테이블에는 세 가지 범주가 모두 포함되어야 합니다. 카테고리에 계정이 없으면 0을 반환합니다. 어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • 급여 범주별 은행 계좌 수 계산
  • UNION ALL을 사용하여 모든 범주 포함
  • 결과 테이블은 정렬 조건 없음

 

✅ SQL 풀이

   SELECT 'Low Salary' AS category
        , COUNT(0) AS accounts_count
     FROM Accounts 
    WHERE income < 20000
UNION ALL 
   SELECT 'Average Salary' AS category
        , COUNT(0) AS accounts_count
     FROM Accounts 
    WHERE income BETWEEN 20000 AND 50000
UNION ALL
   SELECT 'High Salary' AS category
        , COUNT(0) AS accounts_count
     FROM Accounts 
    WHERE income > 50000

 

 

728x90
반응형