본문 바로가기
DATA

[SQL] 인프런 Do it! SQL 입문 정리 (5) - 주식 분석

by 진자이 2023. 7. 19.

안녕하세요 진자이입니다 :) BOAZ 2023 하계 스터디로 SQL을 공부하게 되면서 SQL을 처음부터 다시 공부하게 되었습니다. 공부한 내용을 정리하며 복기도 하고, 많은 분들에게 도움이 되었으면 하는 마음으로 SQL 기초에 대한 내용을 기록하려고 합니다.

DO IT SQL입문의 내용은 6장의 내용인 주식 분석의 주제와 코드를 살피는 것으로 마무리합니다. 감사합니다!

 

주식 분석

52주 동안의 주가 분석하기

최저, 최고, 가격 차이, 비율 검색(stock 테이블)

-- 코드

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_RATE,
FROM STOCK
WHERE DATE >= DATEADD(WEEK, -52, '2021-10-04') -- 21년 10월 4일이전 52주부터 검색한다는 뜻
	AND DATE <= '2021-10-04'
GROUP BY SYMBOL
ORDER BY W52_DIFF_PRICE DESC

주가가 연속 상승한 종목 분석하기

stock 테이블에서 2021년 2월 17일부터 2021년 2월 24일까지 일별 주식 데이터를 비교해 주가가 10% 이상 오른 종목 중 해당 기간 동안 한 번도 주가가 떨어지지 않은 종목 검색

-- (1) 기간 동안 종목별 등락 계산
select
	a.symbol,
	a.[close] as a_close,
	b.[close] as b_close,
	b.[close] - a.[close] as close_diff,
	(b.[close] - a.[close]) / a.[close] * 100 as ratio_diff
	INTO #TEMP --임시 테이블로 저장 INSERT INTO SELECT와 같은 결과
FROM (
	SELECT
		SYMBOL,
		[CLOSE]
	FROM STOCK
	WHERE DATE = '2021-02-17' AS A
	INNER JOIN (
	SELECT
		SYMBOL,
		[CLOSE]
	FROM STOCK
	WHERE DATE = '2021-02-24') AS B ON A.SYMBOL = B.SYMBOL

-- #TEMP 데이터 확인
SELECT * FROM #TEMP


-- (2)  1에서 추출한 SYMBOL 중 10% 이상 상승한 종목만 STOCK 조인해 데이터 저장
SELECT
	ROW_NUMBER() OVER (PARTITION BY A.SYMBOL ORDER BY DATE ASC) AS NUM
	A.SYMBOL,
	B.DATE,
	B.[CLOSE]
	INTO #TEMP2
FROM #TEMP AS A
	INNER JOIN STOCK AS B ON A.SYMBOL = B.SYMBOL
WHERE A.RATIO_DIFF >= 10
	AND B.DATE >= '2021-02-17'
	AND B.DATE <= '2021-02-24'

-- #TEMP2 데이터 확인
SELECT * FROM #TEMP2


-- (3) 같은 SYMBOL 기준으로 전일 데이터 비교
SELECT
	B.SYMBOL
	A.[DATE] AS A_DATE,
	A.[CLOSE] AS A_CLOSE,
	B.[DATE] AS B_DATE,
	B.[CLOSE] AS B_CLOSE,
	B.[CLOSE] - A.[CLOSE] AS CLOSE_DIFF,
	(B.[CLOSE] - A.[CLOSE]) / A.[CLOSE] * 100 AS RATIO_DIFF,
	INTO #TEMP3
FROM #TEMP2 AS A --INNER 조인할 때는 ALIAS 꼭 써주기
	INNER JOIN #TEMP2 AS B ON A.SYMBOL = B.SYMBOL AND A.NUM = B.NUM -1
ORDER BY B.SYMBOL, B.DATE

-- #TEMP3 데이터 검색
SELECT * FROM #TEMP3


-- (4) 3의 결과에서 하락이 한 번도 없는 데이터 추출
SELECT
	SYMBOL,
	A_DATE,
	ROUND(A_CLOSE, 2) AS A_CLOSE,
	B_DATE,
	ROUND(B_CLOSE, 2) AS B_CLOSE,
	ROUND(CLOSE_DIFF, 2) AS CLOSE_DIFF,
	ROUND(RATIO_DIFF, 2) AS RATIO_DIFF
	INTO #TEMP4
FROM #TEMP3
WHERE SYMBOL NOT IN (SELECT SYMBOL FROM #TEMP3 WHERE RATIO_DIFF <0 GROUP BY SYMBOL)

-- #TEMP4 데이터 검색
SELECT * FROM #TEMP4


-- (5) NASDAQ_COMPANY 테이블과 앞의 임시 테이블을 조인해 최종 정보 표시
SELECT
	A.SYMBOL,
	D.COMPANY_NAME,
	D.INDUSTRY
	ROUND(A.A_CLOSE, 2) AS A_CLOSE,
	ROUND(A.B_CLOSE, 2) AS B_CLOSE,
	ROUND(A.CLOSE_DIFF, 2) AS DIFF_PRICE,
	ROUND(A.RATIO_DIFF, 2) AS DIFF_RATIO,
FROM #TEMP AS A
	INNER JOIN (SELECT SYMBOL FROM #TEMP2 GROUP BY SYMBOL) AS B ON A.SYMBOL = B.SYMBOL
	INNER JOIN (SELECT SYMBOL FROM #TEMP4 GROUP BY SYMBOL) AS  CON A.SYMBOL = C.SYMBOL
	INNER JOIN NASDAQ_COMPANY AS D ON A.SYMBOL = D.SYMBOL
ORDER BY RATIO_DIFF DESC



-- (6) 임시로 만든 테이블 삭제
DROP TABLE #TEMP
DROP TABLE #TEMP2
DROP TABLE #TEMP3
DROP TABLE #TEMP4