[SQL#118]585. Investments in 2016

Gi Woon Lee·2024년 9월 5일

SQL

목록 보기
15/33

585. Investments in 2016

문제 이해

주어진 Insurance 테이블에는 보험 가입자의 투자 정보가 담겨 있으며, 목표는 다음 두 조건을 만족하는 보험 가입자들의 tiv_2016 값의 합계를 구하는 것입니다.

  1. tiv_2015 값이 다른 가입자와 동일한 경우 (즉, 같은 tiv_2015 값을 가진 가입자가 하나 이상 존재).
  2. 가입자의 위치(lat, lon 조합)가 다른 가입자와 중복되지 않는 경우 (즉, 해당 위치가 유일한 경우).

이 두 조건을 만족하는 레코드들의 tiv_2016 값을 소수점 둘째 자리까지 반올림하여 반환합니다.

논리 구현

  • 조건 1: tiv_2015 값이 두 번 이상 등장하는 경우를 찾습니다.

    • GROUP BY tiv_2015HAVING COUNT(*) > 1을 사용하여 이러한 값들을 필터링합니다.
  • 조건 2: 위치(lat, lon)가 고유한 경우를 찾습니다.

    • GROUP BY lat, lonHAVING COUNT(*) = 1을 사용하여 이러한 위치들을 찾습니다.
  • 최종 조합: 두 조건을 WHERE 절에 AND 연산자로 결합하여 최종 필터링을 수행합니다.

최종 쿼리

SELECT 
    ROUND(SUM(tiv_2016), 2) AS tiv_2016
FROM 
    Insurance
WHERE 
    tiv_2015 IN (
        SELECT tiv_2015 
        FROM Insurance 
        GROUP BY tiv_2015 
        HAVING COUNT(*) > 1
    )
    AND (lat, lon) IN (
        SELECT lat, lon 
        FROM Insurance 
        GROUP BY lat, lon 
        HAVING COUNT(*) = 1
    );

쿼리 구현 설명

  1. 서브쿼리 1 - tiv_2015 조건:

    • SELECT tiv_2015 FROM Insurance GROUP BY tiv_2015 HAVING COUNT(*) > 1
    • 이 서브쿼리는 tiv_2015 값이 하나 이상 다른 가입자와 동일한 경우를 찾습니다.
  2. 서브쿼리 2 - 위치 조건:

    • SELECT lat, lon FROM Insurance GROUP BY lat, lon HAVING COUNT(*) = 1
    • 이 서브쿼리는 (lat, lon)이 유일한 가입자들을 찾습니다.
  3. 최종 WHERE 절:

    • 두 서브쿼리의 결과를 AND로 결합하여, tiv_2015가 중복되며 (lat, lon) 조합이 고유한 가입자들을 필터링합니다.
  4. SUM과 ROUND 사용:

    • 조건을 만족하는 가입자들의 tiv_2016 값을 합산(SUM())하고 소수점 둘째 자리까지 반올림(ROUND())하여 결과를 반환합니다.

중요 개념

  • GROUP BY와 HAVING: GROUP BY는 데이터를 특정 열을 기준으로 그룹화하고, HAVING 절은 이 그룹화된 데이터에 대한 조건을 지정하여 필터링합니다.
  • 서브쿼리 사용: 특정 조건에 맞는 데이터를 필터링하기 위해 IN 절과 서브쿼리를 결합하여 복잡한 조건을 구현합니다.
  • 좌표 필터링 (lat, lon): 두 개의 열을 조합하여 고유한 위치를 찾고, 이러한 위치가 고유한지를 확인하는 것이 중요합니다.

이 논리를 통해 문제의 요구사항을 충족하며 정확한 결과를 얻을 수 있습니다.

0개의 댓글