首页 > 解决方案 > 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 和任何建议表示赞赏!

标签: mysqlsqlgroup-bycomparison

解决方案


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


推荐阅读