SQL Server/실기 정리

SQL Server 54강 - 52주 변동률 계산 (서브쿼리와 CASE 활용)

코딩하는냥이 2025. 6. 9. 10:52
반응형

이번 강의에서는 서브쿼리(Subquery)를 활용하여 52주 최저/최고가를 기반으로
주가 차이와 변동률을 계산하는 방법을 알아봅니다.
특히, 0으로 나누는 오류 방지를 위한 CASE 처리 방법도 함께 익혀봅니다.


📌 예제 코드

📄 기본 서브쿼리 사용

SELECT
    X.symbol,
    w52_min,
    w52_max,
    w52_max - w52_min AS w52_diff_price,
    (w52_max - w52_min) / w52_min * 100 AS w52_diff_ratio
FROM (
    SELECT
        symbol,
        CONVERT(decimal(18,2), MIN([close])) AS w52_min,
        CONVERT(decimal(18,2), MAX([close])) AS w52_max
    FROM stock
    WHERE date >= DATEADD(WEEK, -52, '2021-10-04')
      AND date <= '2021-10-04'
    GROUP BY symbol
) AS X;

⚠️ 0 나눗셈 방지 (CASE WHEN 조건 사용)

SELECT
    X.symbol,
    w52_min,
    w52_max,
    w52_max - w52_min AS w52_diff_price,
    CONVERT(decimal(18,2),
        CASE WHEN w52_min > 0 THEN (w52_max - w52_min) / w52_min * 100 ELSE 0 END
    ) AS w52_diff_ratio
FROM (
    SELECT
        symbol,
        CONVERT(decimal(18,2), MIN([close])) AS w52_min,
        CONVERT(decimal(18,2), MAX([close])) AS w52_max
    FROM stock
    WHERE date >= DATEADD(WEEK, -52, '2021-10-04')
      AND date <= '2021-10-04'
    GROUP BY symbol
) AS X;

💻 실행 결과 예시

symbol w52_min w52_max w52_diff_price w52_diff_ratio
MSFT 200 300 100 50
AAPL 120 180 60 50

(예시입니다. 실제 결과는 데이터에 따라 다름)


💬 코드 설명

  • 서브쿼리로 symbol별 MIN, MAX 값을 먼저 계산하고,
  • 외부 쿼리에서 이 값을 바탕으로 주가 차이 및 변동률 계산
  • CASE WHEN을 이용해 w52_min이 0일 경우 0으로 나누는 오류 방지
  • CONVERT(decimal(18,2), ...)로 결과의 소수점 자릿수 정리

💡 포인트 정리

  • 중첩 SELECT문을 활용하면 코드가 깔끔하고 재활용하기 쉬워짐
  • 0으로 나누는 오류는 실무에서 자주 발생하므로 반드시 방어 코드 필요
  • 통계 분석 시 최소값-최대값, 변동률 계산은 중요한 지표가 됩니다

📌 정리하자면, 이 쿼리는 52주 기준으로 주가의 범위와 변동률을 안전하게 분석할 수 있는 구조입니다.
특히, CASE와 CONVERT의 조합은 실무 SQL에서 자주 활용되는 패턴이므로 꼭 익혀두시길 바랍니다.