출처
문제
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 ->결과반환
- WITH절(tmp): stock테이블에서 stock name, operation별로 그룹하하여 각 price의 총합을 계산하고 stock name별로 정렬하라
- WITH절( sell_buy ) : tmp테이블에서 stock_name을 기준으로 total_price을 밑에서 한칸씩 위로 올려서 출력하라
- WHERE 절: buy_price 이 null이 아닌 경우
- 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를 음수로 하여 주식별로 총 합을 계산
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] 프로그래머스 - 언어별 개발자 분류하기 (0) | 2024.07.04 |
---|---|
[문제풀이] 프로그래머스 - FrontEnd 개발자 찾기 (0) | 2024.07.03 |
[문제풀이] 프로그래머스 - 우유와 요거트가 담긴 장바구니 (3) | 2024.07.01 |
[문제풀이] 프로그래머스 - 입양 시각 구하기(2) (2) | 2024.06.28 |
[문제풀이] Leet code - Count Salary Categories (0) | 2024.06.27 |