본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Leet code - Capital Gain/Loss

by kime2 2024. 7. 1.
출처

 

문제

Write a solution to report the Capital gain/loss for each stock.
The Capital gain/loss of a stock is the total gain or loss after buying and selling the stock one or many times.
Return the result table in any order.
The result format is in the following example.

문제에 대한 해석

각 주식별로 매도가에서 매수가를 제외하여 각 주식의 손실 또는 이득을 구하라

 

풀이(MYSQL)

with tmp as (
    select stock_name, operation, sum(price) as total_price
    from Stocks
    group by stock_name, operation 
    order by stock_name), -- 각 주식에 대한 매도, 매수의 총 합
sell_buy as (
    select stock_name, total_price as sell_price , lead(total_price,1)over(partition by stock_name order by operation) as buy_price
    from tmp ) -- 각 주식에 대한 매도, 매수를 한 열에 정리
select stock_name, (sell_price - buy_price) as capital_gain_loss -- 매수 - 매도
from sell_buy
where buy_price is not null

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

 
  1. WITH절(tmp): stock테이블에서 stock name, operation별로 그룹하하여 각 price의 총합을 계산하고 stock name별로 정렬하라
  2. WITH절( sell_buy ) : tmp테이블에서  stock_name을 기준으로 total_price을 밑에서 한칸씩 위로 올려서 출력하라
  3. WHERE 절:  buy_price 이 null이 아닌 경우
  4. SELECT 절: sell_price - buy_price를 계산하여 capital_gain_loss으로 저장
tmp테이블 : 각 주식별로 매도, 매수가의 총합을 계산
sell_buy테이블 : 각 주식별로 sell과 buy컬럼을 한 열로 정리
최종 : null값을 제거하고 sell - buy계산

다른사람 풀이

SELECT stock_name, SUM(
    CASE
        WHEN operation = 'Buy' THEN -price
        ELSE price
    END
) AS capital_gain_loss
FROM Stocks
GROUP BY stock_name

-- 원리 동일
select stock_name
, sum(if(operation = 'Buy', -1, 1) * price) as capital_gain_loss
from stocks
group by stock_name

 

buy일 경우에만 price를 음수로 하여 주식별로 총 합을 계산