mysql - MYSQL 使用 group by 返回给定比较的日期输出
问题描述
我有两张桌子:1)BUYnSELL,2)股票
ticker | buy_or_sell | date | price | num_of_shares |
+--------+-------------+------------+-----------+-------+--
| IBM | BUY | 2019-03-20 | 273.0 | 1100 |
| IBM | BUY | 2019-03-21 | 271.0 | 2400 |
| IBM | SELL | 2019-03-22 | 270.5 | 2500 |
| GOOG | BUY | 2019-03-20 | 86.0 | 2200 |
| GOOG | SELL | 2019-03-20 | 87.0 |1000 |
| GOOG | SELL | 2019-03-21 | 87.5 |1000 |
| GOOG | BUY | 2019-03-21 | 87.0 | 800 |
| GOOG | SELL | 2019-03-22 | 86.0 | 1000 |
| AAPL | BUY | 2019-03-20 | 99.0 |1000 |
| AAPL | BUY | 2019-03-20 | 99.5 | 1000 |
| AAPL | BUY | 2019-03-21 | 100.0 |1000 |
| AAPL | SELL | 2019-03-22 | 103.0 |3000 |
| MSFT | BUY | 2019-03-20 | 186.0 | 1500 |
| MSFT | SELL | 2019-03-21 | 188.0 |1000 |
| MSFT | BUY | 2019-03-22 | 187.0 |5000 |
| ticker | exchange |
+--------+----------+
| AAPL | NASDAQ |
| GOOG | NASDAQ |
| MSFT | NASDAQ |
| IBM | NYSE |
| UNH | NYSE |
我想找到日期:“AAPL”的价格*股票数量,其中buy_or_sell = SELL高于公司在“纳斯达克”购买的(buy_or_sell = BUY)。我不想使用任何自然连接。
我有实现这一目标的查询,但我不知道如何正确组合它们。所以我有:
SELECT distinct A.date, A.ticker, SUM(A.price*A.num_of_shares) AS ‘TOTAL’
FROM BUYnSELL A, STOCK S
WHERE A.ticker='AAPL' AND A.buy_or_sell = 'SELL' AND A.ticker = S.ticker
GROUP BY A.date, A.ticker;
^这将返回日期、股票代码和总价*仅适用于苹果的股票数量
和这个:
SELECT distinct B.date, SUM(B.price*B.num_of_shares) AS 'BTOTAL'
FROM BUYnSELL B, STOCK T
WHERE B.ticker = T.ticker AND B.buy_or_sell = 'BUY' AND T.exchange = 'NASDAQ'
GROUP BY B.date, B.ticker;
^这将返回日期和总价格*仅在纳斯达克购买的任何股票的数量
有谁知道我可以如何组合这两个查询,以便在第一个查询的总数大于第二个查询中给出的值时返回日期?
因此,只有日期 2019-03-22 应该返回,因为当天售出的苹果价值高于第二个查询返回的任何值。
新的 SQL 和任何建议表示赞赏!
解决方案
您可以使用conditional aggregation
:
SELECT A.date, A.ticker,
SUM( CASE WHEN A.buy_or_sell = 'SELL' AND A.ticker='AAPL' THEN
A.price*A.num_of_shares
END ) TOTAL_SELL,
SUM( CASE WHEN A.buy_or_sell = 'BUY' AND S.exchange = 'NASDAQ' THEN
A.price*A.num_of_shares
END ) AS TOTAL_BUY
FROM BUYnSELL A
JOIN STOCK S ON S.ticker = A.ticker
GROUP BY A.date, A.ticker;
PS 更喜欢使用ANSI-92
连接语法而不是ANSI-89
具有逗号分隔表列表的语法。这更容易阅读和理解。
推荐阅读
- javascript - 新事件()与 document.createEvent()
- python - 如何从熊猫数据框输出中删除“[]”
- c# - 如何解决必须在 Xamarin 的主线程上调用权限请求?
- testing - 如何使用“deployment_status”小猫并且仅在 QAS 分支上运行 Github Actions?
- javascript - 如何写入数据以异步提供/注入?
- specflow - 退出 specflow 场景,或避免基于前提条件执行
- javascript - 如何更改工具栏tinymce上按钮的属性标题值?
- javascript - 如何使用popper.js将自定义反应元素悬停在触发器el之外或滚动后保持它在Yaxis上的位置
- javascript - 在 Electron 应用程序中仅使用 asar 打包某些目录
- python - 如何使用 sqlalchamy 从雪花视图中获取数据?