【问题标题】:How to find the profit and loss of a stock in SQL Table如何在 SQL 表中查找股票的盈亏
【发布时间】:2021-11-09 21:56:50
【问题描述】:

我有一个包含列(TRANSACTION_ID、STOCK_NAME、STOCK_ID、VALUE、TYPE)的 SQL 表。该表将不同股票的投资表示为交易。我需要获取 SQL 查询来查找每只股票的总盈亏。

SQL 表

1|REL|2624|6653|sell
2|INFY|7660|3064|buy
3|INFY|4361|3117|buy
4|ITC|7292|6865|buy
5|INFY|2187|2618|buy
6|ITC|7292|7313|sell
7|INFY|3478|3196|sell
8|INFY|3472|3105|sell
9|REL|4472|7398|sell
10|INFY|7660|3351|sell
11|REL|4472|7350|buy
12|REL|5833|8240|buy
13|REL|5833|7937|sell
14|INFY|2187|2487|sell
15|REL|7198|7998|sell
16|INFY|3478|2944|buy
17|REL|2624|6985|buy
18|REL|7198|7645|buy
19|INFY|3472|3046|buy
20|INFY|4361|3384|sell

STOCK_ID 代表该股票的 ID,TYPE 代表交易是买入还是卖出。对于每个 STOCK_ID,将恰好有 1 笔买入交易和 1 笔卖出交易。我需要找到每个股票的盈亏如下

结果

ITC|448
INFY| 734
REL| -234

我有逻辑和公式,但我不知道如何将其转换为 SQL 查询。

我的逻辑 对于每个 STOCK_NAME,找到 STOCK_ID 的总和(利润/损失)为 (TYPE='sell') - (TYPE='buy')。

例如

4|ITC|7292|6865|buy
6|ITC|7292|7313|sell

ITC 的利润/损失 = 7313-6865 = 448

这是用于复制数据的 SQL 查询

BEGIN TRANSACTION;

/* Create a table called NAMES */
CREATE TABLE stocks(id integer PRIMARY KEY, symbol text, stock_id integer, value integer, typ text);

/* Create few records in this table */
INSERT INTO stocks VALUES(1,'REL', 2624, 6653, 'sell');
INSERT INTO stocks VALUES(2,'INFY', 7660, 3064, 'buy');
INSERT INTO stocks VALUES(3,'INFY', 4361, 3117, 'buy');
INSERT INTO stocks VALUES(4,'ITC', 7292, 6865, 'buy');
INSERT INTO stocks VALUES(5,'INFY', 2187, 2618, 'buy');
INSERT INTO stocks VALUES(6, 'ITC', 7292, 7313, 'sell');
INSERT INTO stocks VALUES(7, 'INFY', 3478, 3196, 'sell');
INSERT INTO stocks VALUES(8, 'INFY', 3472, 3105, 'sell');
INSERT INTO stocks VALUES(9, 'REL', 4472, 7398, 'sell');
INSERT INTO stocks VALUES(10, 'INFY', 7660, 3351, 'sell');
INSERT INTO stocks VALUES(11, 'REL', 4472, 7350, 'buy');
INSERT INTO stocks VALUES(12, 'REL', 5833, 8240, 'buy');
INSERT INTO stocks VALUES(13, 'REL', 5833, 7937, 'sell');
INSERT INTO stocks VALUES(14, 'INFY', 2187, 2487, 'sell');
INSERT INTO stocks VALUES(15, 'REL', 7198, 7998, 'sell');
INSERT INTO stocks VALUES(16, 'INFY', 3478, 2944, 'buy');
INSERT INTO stocks VALUES(17, 'REL', 2624, 6985, 'buy');
INSERT INTO stocks VALUES(18, 'REL', 7198, 7645, 'buy');
INSERT INTO stocks VALUES(19, 'INFY', 3472, 3046, 'buy');
INSERT INTO stocks VALUES(20, 'INFY', 4361, 3384, 'sell');
COMMIT;

/* Display all the records from the table */

【问题讨论】:

  • 我已经删除了 all 上面的标签并添加了 [sql]。您标记了冲突的 RDBMS,不要这样做, 列出您真正使用的 RDBMS。您还标记了 [python],但是,我在您的问题中完全没有看到任何关于 python 的内容。如果您的问题是关于 Python 的,那么上面的内容与它有什么关系?

标签: sql


【解决方案1】:

使用嵌套查询。一个总结加减法,然后一个组合它们:

SELECT symbol, SUM(value) AS profit 
FROM (
    SELECT symbol, typ, CASE
        WHEN typ='buy' THEN -SUM(value) 
        WHEN typ='sell' THEN SUM(value) 
    END AS value 
    FROM stocks 
    GROUP BY symbol, typ
) sub
GROUP BY symbol;

输出:

REL|-234
INFY|734
ITC|448

顺便说一句,将您的数据集作为可执行查询包含在内是值得称赞的。这让我的工作轻松了很多。

(对于 MySQL,子查询必须有一个别名 [在本例中为“sub”]。其他 SQL 产品不需要。)

【讨论】:

  • 此查询运行良好。这是一个比我的知识和经验更高级的查询。您能否建议任何参考来学习 SQL 中的高级主题?提前致谢。
  • 不幸的是,我没有。而且我不是专家。除了 45 年前的大学,我还学习了我所知道的为旁人做网站的工作。
  • 总和可以环绕大小写以消除两步分组。
猜你喜欢
  • 2015-03-09
  • 2011-03-07
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多