我有两张桌子: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 =卖出高于公司在'纳斯达克'买入的股票(buy_or_sell =买入)。我不想使用任何自然连接。
我有实现这一点的查询,但我不知道如何正确组合它们。所以我有:
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日期才会返回,因为当天卖出的apple值高于第二个查询返回的任何值。
SQL新手以及任何建议表示赞赏!
一个非常简单的方法:
select A.date from BUYnSELL as A, STOCK as B
where A.ticker = B.ticker
group by A.ticker, A.date
having
sum(
if(A.buy_or_sell='SELL' AND A.ticker = 'AAPL', 1,
if(A.buy_or_sell='BUY' AND B.exchange = 'NASDAQ',-1,0))
* A.price * A.num_of_shares) > 0;
基本上:如果它是“卖”和“APPLE”,你乘以1(加)。如果是“买入”和“纳斯达克”,则乘以-1(减去)。否则,乘以0(不做任何事情)。
最后,您只取正值,即卖出大于买入的值。
你可以使用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;
附:更喜欢使用ANSI-92
连接语法而不是ANSI-89
语法,它具有逗号分隔表列表。这更容易阅读和理解。