국비

[ 37일차 53~54 ] 수업 정리 - SQL

코딩하는냥이 2025. 6. 10. 15:09
반응형

오늘은 주식 데이터(stock 테이블)를 이용하여 52주 기준의 최소/최대 종가, 가격 차이, 등락률을 구하는 방법을 배웠습니다. 실무에서 주가 분석 지표로 자주 활용되는 로직입니다.


📌 52주 가격 통계 구하기

📘 기본 쿼리 구조

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

💡 해당 쿼리는 각 종목(symbol)에 대해 최근 52주(2021-10-04 기준) 동안의:

  • 최저 종가 w52_min
  • 최고 종가 w52_max
  • 가격 차이 w52_diff_price
  • 등락률 w52_diff_ratio (최저가 대비 등락 퍼센트)

📌 서브쿼리 방식으로 리팩터링한 버전

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 BETWEEN DATEADD(WEEK, -52, '2021-10-04') AND '2021-10-04'
	GROUP BY symbol
) AS X

💡 이 방식은 계산식을 SELECT 절 바깥에서 처리하여 가독성과 재활용성을 높입니다.


📌 0으로 나눔 방지 로직 포함한 안전한 버전

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 BETWEEN DATEADD(WEEK, -52, '2021-10-04') AND '2021-10-04'
	GROUP BY symbol
) AS X

💡 CASE WHEN w52_min > 0 조건을 통해 0으로 나누는 오류를 방지합니다.


💡 포인트 정리

  • DATEADD(WEEK, -52, 기준일자)를 이용하면 최근 1년(52주)의 데이터를 필터링할 수 있다.
  • MIN(), MAX() 함수로 최소/최대 종가를 추출하고, 이를 이용해 가격 변화량과 등락률을 계산할 수 있다.
  • 계산 시 0 나눗셈 오류 방지를 위해 CASE WHEN 구문을 활용하는 것이 안전하다.
  • 복잡한 연산은 서브쿼리로 분리하면 유지 보수성과 가독성이 향상된다.

📌정리하자면, 오늘은 최근 52주간의 주가 분석을 주제로, 주식 종목별 최소/최대 가격과 가격 변화율을 SQL로 계산하는 방법을 배웠습니다. 실전에서 활용도가 높은 주제인 만큼, 다양한 변형 쿼리를 통해 익숙해지는 것이 중요합니다.