본문 바로가기

[LeetCode] SQL50 - Basic Joins 문제풀이

by qwee0328 2025. 2. 13.

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

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

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

 

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

 


 

📝1378. Replace Employee ID With The Unique Identifier

🔹 직원 ID를 고유 식별자로 대체

각 사용자의 고유 ID를 표시하는 솔루션을 작성하세요.
사용자에게 고유 ID가 없으면 null만 표시하면 됩니다.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • Employees 테이블에는 직원의 id와 name이 존재
  • EmployeeUNI 테이블에는 직원의 id와 unique_id가 존재
  • 직원 ID(id)를 기준으로 조인하여 해당 직원의 unique_id를 조회

 

✅ SQL 풀이

   SELECT b.unique_id
        , a.name
     FROM Employees a
LEFT JOIN EmployeeUNI b
       ON a.id = b.id

 

 


 

📝1068. Product Sales Analysis 1

🔹 상품 판매 분석 1

Sales 테이블의 각 sale_id에 대한 product_name, 연도 및 가격을 보고하는 솔루션을 작성하세요.
결과 테이블을 어떤 순서로든 반환합니다.

 

 

🔍 문제 설명

  • Sales 테이블에는 product_id, year, price 존재
  • Product 테이블에는 product_id, product_name 존재
  • product_id를 기준으로 조인하여 product_name, year, price 조회

 

✅ SQL 풀이

SELECT b.product_name
     , a.year
     , a.price
  FROM Sales a
  JOIN Product b
    ON a.product_id = b.product_id

 

 


 

📝1581. Customer Who Visited but Did Not Make Any Transactions

🔹 방문했으나 거래를 하지 않은 고객

거래 없이 방문한 사용자의 ID와 이러한 유형의 방문 횟수를 찾는 솔루션을 작성하세요.
임의의 순서로 정렬된 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • Visits 테이블에는 visit_id, customer_id 존재
  • Transactions 테이블에는 visit_id, transaction_id 존재
  • Transactions에 없는 visit_id를 기준으로 customer_id별 방문 횟수(count) 조회

 

✅ SQL 풀이

   SELECT a.customer_id
        , COUNT(a.visit_id) AS count_no_trans
     FROM Visits a
LEFT JOIN Transactions b
       ON a.visit_id = b.visit_id
    WHERE b.transaction_id IS NULL
 GROUP BY a.customer_id

 

 

반응형

 

📝197. Rising Temperature

🔹 온도 상승

이전 날짜(어제)에 비해 온도가 더 높은 모든 날짜의 ID를 찾는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • Weather 테이블에는 id, recordDate, temperature 존재
  • 같은 테이블에서 하루 전(recordDate - 1)과 비교하여 온도가 더 높은 경우 해당 id 조회

 

✅ SQL 풀이

SELECT a.id
  FROM Weather a, Weather b
 WHERE DATEDIFF(a.recordDate, b.recordDate) = 1
   AND a.temperature > b.temperature

 

 


 

📝1661.  Average Time Of Process per Machine

🔹 기계당 평균 처리 시간

각각 동일한 수의 프로세스를 실행하는 여러 컴퓨터가 있는 공장 웹사이트가 있습니다.
각 기계가 프로세스를 완료하는 데 걸리는 평균 시간을 구하는 솔루션을 작성하세요.

프로세스를 완료하는 데 걸리는 시간은 'end' 타임스탬프에서 'start' 타임스탬프를 뺀 시간입니다.
평균 시간은 머신의 모든 프로세스를 완료하는 데 걸린 총 시간을 실행된 프로세스 수로 나누어 계산합니다.
결과 테이블에는 machine_id와 함께 평균 시간(processing_time)이 있어야 하며 소수점 이하 3자리에서 반올림되어야 합니다.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • Activity 테이블에는 machine_id, process_id, timestamp, activity_type 존재
  • start와 end 타임스탬프 차이를 구해 기계별 평균 처리 시간 계산
  • 평균 시간을 소수점 세 자리에서 반올림

 

✅ SQL 풀이

   SELECT a.machine_id
        , ROUND(AVG(b.timestamp - a.timestamp), 3) AS processing_time
     FROM Activity a
LEFT JOIN Activity b
       ON a.machine_id = b.machine_id
      AND a.process_id = b.process_id
      AND a.activity_type != b.activity_type
    WHERE a.activity_type = 'start'
 GROUP BY a.machine_id

 

 


 

📝577.  Employee Bonus

🔹 직원 보너스

보너스가 1000 미만인 각 직원의 이름과 보너스 금액을 보고하는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • Employee 테이블에는 empId, name 존재
  • Bonus 테이블에는 empId, bonus 존재
  • Bonus가 1000 미만이거나 NULL인 직원의 name, bonus 조회

 

✅ SQL 풀이

SELECT a.name
     , b.bonus
  FROM Employee a
  LEFT JOIN Bonus b
    ON a.empId = b.empId
 WHERE b.bonus < 1000 
    OR b.bonus IS NULL

 

 

728x90

 

📝1280.  Students and Examinations

🔹 학생과 시험

각 학생이 각 시험에 참석한 횟수를 구하는 풀이를 작성하세요.
Student_id와 subject_name으로 정렬된 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • Students 테이블에는 student_id, student_name 존재
  • Subjects 테이블에는 subject_name 존재
  • Examinations 테이블에는 student_id, subject_name 존재
  • CROSS JOIN을 활용해 학생별 모든 과목을 매칭하고, LEFT JOIN으로 Examinations 정보 결합

 

✅ SQL 풀이

    SELECT a.student_id
         , a.student_name
         , b.subject_name
         , COUNT(c.student_id) AS attended_exams
      FROM Students a
CROSS JOIN Subjects b
 LEFT JOIN Examinations c
        ON a.student_id = c.student_id
       AND b.subject_name = c.subject_name
  GROUP BY a.student_id
         , a.student_name
         , b.subject_name
  ORDER BY a.student_id
         , b.subject_name

 

 


 

📝570. Managers with at Least 5 Direct Reports

🔹 직속상관이 5명 이상인 관리자

5명 이상의 직속 부하 직원이 있는 관리자를 찾는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • Employee 테이블에서 managerId가 있는 직원들의 managerId를 기준으로 그룹화
  • managerId가 5명 이상인 관리자 조회

 

✅ SQL 풀이

   SELECT b.name
     FROM Employee a
LEFT JOIN Employee b
       ON a.managerId = b.id
 GROUP BY b.id
   HAVING COUNT(b.id) >= 5

 

 


 

📝1937. Confirmation Rate

🔹 확정률

사용자의 확인 비율은 'confirmed' 메시지 수를 요청한 전체 확인 메시지 수로 나눈 값입니다.
확인 메시지를 요청하지 않은 사용자의 확인 비율은 0입니다.
확인 비율은 소수점 이하 두 자리에서 반올림합니다.
각 사용자의 확인률을 구하는 솔루션을 작성하세요. 어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • Signups 테이블에는 user_id 존재
  • Confirmations 테이블에는 user_id, action(confirmed 또는 NULL) 존재
  • 확인율 계산: confirmed 비율을 구하고, 없는 경우 0 처리

 

✅ SQL 풀이

   SELECT a.user_id
        , ROUND(IFNULL(COUNT(CASE WHEN b.action = 'confirmed' THEN b.user_id END) / COUNT(b.user_id), 0), 2) AS confirmation_rate
     FROM Signups a
LEFT JOIN Confirmations b
       ON a.user_id = b.user_id
 GROUP BY a.user_id

 

728x90
반응형