본문 바로가기

IT Story/SQL Story

보유 주식 수익 증감액 구하기

01. 내가 보유한 주식 테이블 생성하기

주식 매입 날짜, 수량, 구매가 데이터를 임시 테이블에 저장하기

CREATE TABLE #mystock (

date datetime,                --날짜 자료형

symbol nvarchar(255),  --문자 자료형

qty int,                              -- 정수형

price decimal(18,2)      --실수형

)

INSERT INTO #mystock VALUES('2019-01-02', 'TSLA', 10, 61.00)

INSERT INTO #mystock VALUES('2019-05-23', 'TSLA', 20, 39.00)

INSERT INTO #mystock VALUES('2019-07-14', 'TSLA', 5, 300.00)

INSERT INTO #mystock VALUES('2019-01-07', 'MSFT', 3, 100.00)

INSERT INTO #mystock VALUES('2019-08-07', 'MSFT', 6, 132.00)

INSERT INTO #mystock VALUES('2019-11-29', 'MSFT', 2, 151.00)

SELECT * FROM #mystock

결과

date                                            symbol     qty       price
2019-01-02 00:00:00.000       TSLA      10       61.00
2019-05-23 00:00:00.000       TSLA       20      39.00
2019-07-14 00:00:00.000       TSLA        5       300.00
2019-01-07 00:00:00.000       MSFT       3       100.00
2019-08-07 00:00:00.000       MSFT       6       132.00
2019-11-29 00:00:00.000       MSFT       2       151.00

 

02. 나의 주식 증감액 검색하

#mystock과 일별 주가 데이터를 조인해 일별 증감액을 검색하기

SELECT 

     CONVERT(NVARCHAR(10), x.date, 120) AS date,

     CONVERT(DECIMAL(18,2), sum(x.benefit)) AS benefit

FROM (

     SELECT

           b.date,

           b.symbol,

           (b.[close] -a.price) *qty AS benefit

     FROM #mystock AS a

                LEFT OUTER JOIN stock AS b ON a.symbol COLLATE Latin1_General_CI_AS = b.symbol

                AND a.date <= b.date

     ) AS x

GROUP BY x.date

ORDER BY x.date

결과

date                       benefit
2019-01-02          10.24
2019-01-03           -9.28
2019-01-04           25.38
2019-01-07           66.10
2019-01-08           69.10

쿼리에서 LEFT OUTER JOIN 문을 사용했는데, #mystock 테이블을 기준으로 stock 테이블을 조인시켰고, JOIN 조건인 ON 문을 보면  a.date <= b.date로 현재 자신이 구입한 날짜를 포함해 이후 날짜의 데이터와 조인했다. 이유는 자신이 주식을 구입한 날짜로부터 수익에 관한 증감을 구할 수 있기 때문이다. 또한 COLLATE Latin1_General_CI_AS를 사용했는데, 이는 SQL 서버 환경의 데이터 정렬 속성이 Korean_Wansung_CI_AS 속성으로 만들어졌기 때문이다. 따라서 문자열을 조인 조건으로 사용하면 서로 다른 정렬 속성 때문에 비교할 수 없으므로,  #mystock의 symbol 열을 COLLATE Latin1_General_CI_AS를 사용해 명시적으로 변경했다.

 

03. 증감액을 그래프로 보

엑셀에 붙여넣기 해 차트를 생성한다.

 

04. 종목별 증감액 검색하

symbol 별로 증감액을 검색한다

SELECT 

     x.symbol,

     CONVERT(NVARCHAR(10), x.date, 120) AS date,

     CONVERT(DECIMAL(18,2), sum(x.benefit)) AS benefit

FROM (

     SELECT

           b.date,

           b.symbol,

           (b.[close] -a.price) *qty AS benefit

     FROM #mystock AS a

                LEFT OUTER JOIN stock AS b ON a.symbol COLLATE Latin1_General_CI_AS = b.symbol

                AND a.date <= b.date

     ) AS x

GROUP BY x.symbol, x.date

ORDER BY x.symbol, x.date

결과

symbol    date                 benefit
MSFT    2019-01-07       6.18
MSFT    2019-01-08       8.40
MSFT    2019-01-09     12.81
MSFT    2019-01-10     10.80

...

TSLA    2019-01-07      59.92
TSLA    2019-01-08      60.70
TSLA    2019-01-09      67.06
TSLA    2019-01-10      79.94

SELECT와 GROUP BY에 symbol을 추가해, symbol을 단위로 일별 증감액을 검색한다.