SUM的SQL聚合查询,但只允许正数(否则为0)

时间:2011-07-05 11:18:33

标签: mysql sql aggregate-functions

我想查询订单表并显示客户ID和所有订单的总数,但订单可以有正数或负数。

select customer_id, SUM(order_total) from orders group by customer_id;

现在我的问题 - 如何在一个SQL查询中实现以下功能:

如果总和是正数,我想按原样显示;如果总和是负数,我只想显示0而不是实际金额。

我正在寻找的是一个可以处理此问题的函数,类似于IFNULL函数(IFNULL(SUM(order_total),0)),但不是检查null,而是应该检查否定结果。

伪代码:

IFNEGATIVE(SUM(order_total),0)

标准sql中是否有一种简单的方法(或者特别是在Mysql 5.5中,也可以)。

8 个答案:

答案 0 :(得分:11)

SELECT customer_id,
  CASE 
    WHEN SUM(order_total) < 0 THEN 0
    ELSE SUM(order_total)
  END
  FROM orders 
  GROUP BY customer_id;

检查您的执行计划,但2 SUM可能会优化为一个SUM

答案 1 :(得分:8)

尝试:

select customer_id, GREATEST( SUM(order_total),0) from orders group by customer_id;

答案 2 :(得分:3)

未经测试,但这样的事情应该这样做:

SELECT customer_id , IF( SUM(order_total) > 0, SUM(order_total), 0) AS sum FROM orders GROUP BY customer_id

答案 3 :(得分:1)

如果我理解它只包装 GREATEST

SELECT customer_id, GREATEST(0,SUM(order_total)) 
FROM orders GROUP BY customer_id;

查看link

答案 4 :(得分:1)

你能否使用CASE声明?

类似的东西:

CASE WHEN [Field] < 0 THEN 0

或者我错过了什么?

答案 5 :(得分:0)

select Id,case when (sum(amount)<0) then 0 else sum(amount) end  from tblsum group by Id

答案 6 :(得分:0)

您也可以尝试;

select 
  (sum(fld) + abs(sum(fld))) / 2
from tbl

答案 7 :(得分:-2)

仅显示正面使用HAVING因此:

select customer_id, SUM(order_total) from orders group by customer_id HAVING SUM(order_total) > 0;

否则使用此处其他地方列出的案例