Mysql SQL聚合查询求和,但只允许正和(否则为0)

Mysql SQL聚合查询求和,但只允许正和(否则为0),mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我想查询orders表并显示客户id和他所有订单的总数,但是这些订单可以有正数或负数 select customer_id, SUM(order_total) from orders group by customer_id; 现在我的问题是-如何在一个sql查询中实现以下目标: 如果总和为正数,我希望按原样显示;如果总和为负数,我只想显示0,而不是实际金额。 我要寻找的是一个能够处理这个问题的函数,类似于IFNULL函数(IFNULL(SUM(order_total),0)),但它不检查nu

我想查询orders表并显示客户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中,也可以)。

如果我理解它的唯一含义,请用最伟大的

查看

选择客户id,
案例
当总和(总阶数)小于0时,则为0
其他金额(订单总数)
结束
从命令
按客户id分组;

检查您的执行计划,但2个
SUM
s可能会被优化为引擎盖下的单个
SUM

您能否使用案例陈述

比如:

CASE WHEN [Field] < 0 THEN 0
当[Field]<0然后为0时的情况

还是我遗漏了什么?

未经测试,但像这样的东西应该可以:

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

仅显示积极用途,因此:

select customer_id, SUM(order_total) from orders group by customer_id HAVING SUM(order_total) > 0;
否则,请使用此处其他地方列出的用例

尝试:

select customer_id, GREATEST( SUM(order_total),0) from orders group by customer_id;
选择Id,case when(sum(amount)您也可以尝试

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

这将限制他的搜索,但当总和为负数时,它不会显示0。理解错误的“显示零”,但在其他情况下,将答案留在此处…这将只对可能的顺序求和。OP要求所有顺序的总和。您遗漏了一些内容。总和不应为负数-单个行可以混合+ve和-ve,只要有由于总和不是否定的,这感觉太简单了!谢谢。非常感谢,我没有经常在sql中使用案例,很高兴知道:)我认为提供的一些其他答案(即,如果也有效),但是,让我在这里接受这一票,我也投票给其他人。它不应该是(总和(fld)+总和(abs)(fld)))/2对于可读性/可维护性,我也更喜欢这样做,但在我这方面,一个类似场景的快速检查显示,SQL 2012中的执行计划是相同的-SQL server可以发现您只需要它一次。我意识到这是一个老问题,我刚刚看到它实际上是针对MySQL的,但这似乎是一个非常低挂起的optim我敢打赌MySQL也能做到这一点。
select customer_id, GREATEST( SUM(order_total),0) from orders group by customer_id;
select Id,case when (sum(amount)<0) then 0 else sum(amount) end  from tblsum group by Id
select 
  (sum(fld) + abs(sum(fld))) / 2
from tbl