题目描述
(通过次数21,692 | 提交次数25,662,通过率84.53%)
Stocks表: +---------------+---------+ | Column Name | Type | +---------------+---------+ | stock_name | varchar | | operation | enum | | operation_day | int | | price | int | +---------------+---------+ (stock_name, day) 是这张表的主键 operation 列使用的是一种枚举类型,包括:('Sell','Buy') 此表的每一行代表了名为 stock_name 的某支股票在 operation_day 这一天的操作价格。 保证股票的每次'Sell'操作前,都有相应的'Buy'操作。 编写一个SQL查询来报告每支股票的资本损益。 股票的资本损益是一次或多次买卖股票后的全部收益或损失。 以任意顺序返回结果即可。 SQL查询结果的格式如下例所示: Stocks 表: +---------------+-----------+---------------+--------+ | stock_name | operation | operation_day | price | +---------------+-----------+---------------+--------+ | Leetcode | Buy | 1 | 1000 | | Corona Masks | Buy | 2 | 10 | | Leetcode | Sell | 5 | 9000 | | Handbags | Buy | 17 | 30000 | | Corona Masks | Sell | 3 | 1010 | | Corona Masks | Buy | 4 | 1000 | | Corona Masks | Sell | 5 | 500 | | Corona Masks | Buy | 6 | 1000 | | Handbags | Sell | 29 | 7000 | | Corona Masks | Sell | 10 | 10000 | +---------------+-----------+---------------+--------+ Result 表: +---------------+-------------------+ | stock_name | capital_gain_loss | +---------------+-------------------+ | Corona Masks | 9500 | | Leetcode | 8000 | | Handbags | -23000 | +---------------+-------------------+ Leetcode 股票在第一天以1000美元的价格买入,在第五天以9000美元的价格卖出。资本收益=9000-1000=8000美元。 Handbags 股票在第17天以30000美元的价格买入,在第29天以7000美元的价格卖出。资本损失=7000-30000=-23000美元。 Corona Masks 股票在第1天以10美元的价格买入,在第3天以1010美元的价格卖出。在第4天以1000美元的价格再次购买,在第5天以500美元的价格出售。最后,它在第6天以1000美元的价格被买走,在第10天以10000美元的价格被卖掉。资本损益是每次(’Buy'->'Sell')操作资本收益或损失的和=(1010-10)+(500-1000)+(10000-1000)=1000-500+9000=9500美元。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/capital-gainloss
//测试数据 Create Table If Not Exists Stocks (stock_name varchar(15), operation ENUM('Sell', 'Buy'), operation_day int, price int); insert into Stocks (stock_name, operation, operation_day, price) values ('Leetcode', 'Buy', '1', '1000'); insert into Stocks (stock_name, operation, operation_day, price) values ('Corona Masks', 'Buy', '2', '10'); insert into Stocks (stock_name, operation, operation_day, price) values ('Leetcode', 'Sell', '5', '9000'); insert into Stocks (stock_name, operation, operation_day, price) values ('Handbags', 'Buy', '17', '30000'); insert into Stocks (stock_name, operation, operation_day, price) values ('Corona Masks', 'Sell', '3', '1010'); insert into Stocks (stock_name, operation, operation_day, price) values ('Corona Masks', 'Buy', '4', '1000'); insert into Stocks (stock_name, operation, operation_day, price) values ('Corona Masks', 'Sell', '5', '500'); insert into Stocks (stock_name, operation, operation_day, price) values ('Corona Masks', 'Buy', '6', '1000'); insert into Stocks (stock_name, operation, operation_day, price) values ('Handbags', 'Sell', '29', '7000'); insert into Stocks (stock_name, operation, operation_day, price) values ('Corona Masks', 'Sell', '10', '10000');
解题思路
源表Stocks表保存了每只股票每天的卖入价和卖出价。
题目要求:计算每只股票的最终资本损益(卖出价-买入价的累计值)。
既然是计算每只股票的累计值,那么可以使用GROUP BY+SUM来实现。但是,这里需要累计的是卖出价与买入价的差值。卖出价与买入价在不同的行,无法直接计算差值。所以可以对买入价*-1,将差值计算,转换为加法运算。
这样就可以直接使用SUM获取累计值。
参考SQL
未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select stock_name, sum(case when operation = 'Buy' then price * -1 else price end) capital_gain_loss from Stocks group by stock_name;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。