繁体   English   中英

在WHERE条件下的mysql SUM列

[英]mysql SUM column on WHERE condition

我试图获取满足条件的所有列的总和。 这是我当前的设置

    SELECT 
                      COUNT(order_type = 'BUY') AS buy_fill,
                      COUNT(order_type = 'SELL') AS sell_fill,
                      SUM(btc_total) AS fill_sum
                      FROM fill_orders
                      WHERE coin_id = '$coin'
                      AND time_stamp >= DATE_SUB(NOW(), INTERVAL 55 SECOND)

这就是我现在所拥有的,它计算着我拥有多少类型的买卖订单,并且还给了我所有订单的总和,但是我需要将订单总和分解为买入订单和卖出订单。

这是我正在尝试使之工作的代码。 我添加了(btc_total WHERE order_type ='BUY')和SUM(btc_total WHERE order_type ='SELL')

      SELECT 
                            COUNT(order_type = 'BUY') AS buy_fill,
                            COUNT(order_type = 'SELL') AS sell_fill,
                            SUM(btc_total) AS fill_sum,

                            SUM(btc_total WHERE order_type = 'BUY') AS buy_total
                            SUM(btc_total WHERE order_type = 'SELL') AS sell_total
                      FROM fill_orders
                      WHERE coin_id = '$coin'
                      AND time_stamp >= DATE_SUB(NOW(), INTERVAL 55 SECOND)

更改此:

SUM(btc_total WHERE order_type = 'BUY') AS buy_total

对此:

SUM(IF(order_type='BUY',btc_total,NULL)) AS buy_total

MySQL IF()函数将第一个参数评估为布尔值,如果为TRUE,则返回第二个参数,否则返回第三个参数。

将为每一行评估IF() ,并且该表达式的返回值将通过SUM()集合进行累加。

或者,使用等效的ANSI标准来达到相同的结果:

SUM(CASE WHEN order_type = 'BUY' THEN btc_total END) AS buy_total

这种模式通常称为“条件聚合”。

对于“计数”,我们可以将COUNT替换为SUM ,如下所示:

SUM(order_type = 'BUY') AS buy_fill

MySQL将相等性比较评估为布尔值,该布尔值返回1、0或NULL,然后由SUM聚合求和。 (其中的COUNT将包括零和一,而不仅仅是零。)

以上相当于

SUM( CASE
     WHEN order_type  = 'BUY' THEN 1
     WHEN order_type <> 'BUY' THEN 0
     ELSE NULL
     END
   ) AS buy_fill

如果要使用COUNT聚合,可以这样进行:

COUNT(IF(order_type = 'Buy',1,NULL)) AS buy_fill

(我们可以使用任何非null值代替1 ,并获得等效的结果。)

“条件聚合”通常包含一个case expression

SELECT
      COUNT(CASE WHEN order_type = 'BUY' THEN order_type END)      AS buy_fill
    , COUNT(CASE WHEN order_type = 'SELL' THEN order_type END)     AS sell_fill
    , SUM(btc_total)                                               AS fill_sum
    , SUM(CASE WHEN order_type = 'BUY' THEN btc_total ELSE 0 END)  AS buy_total
    , SUM(CASE WHEN order_type = 'SELL' THEN btc_total ELSE 0 END) AS sell_total
FROM fill_orders
WHERE coin_id = '$coin'
AND time_stamp >= DATE_SUB(NOW(), INTERVAL 55 SECOND)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM