MYSQL使用group by返回日期的输出

问题描述 投票:2回答:2

我有两张桌子: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新手以及任何建议表示赞赏!

mysql sql group-by comparison
2个回答
1
投票

一个非常简单的方法:

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(不做任何事情)。

最后,您只取正值,即卖出大于买入的值。


2
投票

你可以使用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语法,它具有逗号分隔表列表。这更容易阅读和理解。

© www.soinside.com 2019 - 2024. All rights reserved.