【问题标题】:MYSQL Return output of dates given a comparison using group byMYSQL 使用 group by 返回给定比较的日期输出
【发布时间】:2019-04-11 21:24:39
【问题描述】:

我有两张桌子: 1) 买入,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 高于公司在 'NASDAQ' 购买的 (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 新手,欢迎提出任何建议!

【问题讨论】:

    标签: mysql sql group-by comparison


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      一个很简单的方法:

      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; 
      

      基本上:如果是“卖出”和“苹果”,则乘以 1(加法)。如果是“买入”和“纳斯达克”,则乘以 -1(减去)。否则,乘以 0(不执行任何操作)。

      最后,您只取正值,即 SELL 大于 BUY 的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        相关资源
        最近更新 更多