将所有值相加,忽略减号

时间:2012-08-06 13:20:45

标签: mysql codeigniter

好的,我有一个mySQL值表。有些是积极的,有些是消极的。负面的人在桌子上面对他们。我正在使用Codeigniter。

我需要将它们全部加在一起,但是在负值之前IGNORE。我只是想对数字求和,而不是将它们作为负数。

例如,这就是它目前所做的事情: -55 + -20 = 35

但我想要它做的是: -55 + -20 = 75

基本上我只想对这些值求和,无论它们的正面还是负面。

我该怎么做?这是我的疑问:

$this->db->select_sum('vat')
     ->from('accounts')->where_in('type', 'Expenses')
     ->where('date <=', $current_period)
     ->where('date >=', $previous_period);

4 个答案:

答案 0 :(得分:5)

也许这样的事情会起作用:

$this->db->select('SUM(CASE WHEN vat >= 0 THEN vat ELSE -vat END) AS sum', false)->from('accounts')->where_in('type', 'Expenses')->where('date <=', $current_period)->where('date >=', $previous_period);

这应该保持vat正数的正数并将负数转换为正数。注意:false语句中的select()会阻止CI自动转义字段。

另外,从@shubhansh的评论中可以看出,您可以使用MySQL的ABS()方法来获取绝对值,而不是CASE

$this->db->select('SUM(ABS(vat)) AS sum', false)->from('accounts')->where_in('type', 'Expenses')->where('date <=', $current_period)->where('date >=', $previous_period);

答案 1 :(得分:0)

我可以想到两种方式。

第一种方式:我很确定CI会转义字段名称,所以要这样做,你需要执行普通查询:

$this->db->query('SELECT SUM(AVG(vat)) FROM accounts WHERE ...'); // Replace ... with WHERE parameters 

第二种方式:或者做两个查询并对结果求和:

$positive = $this->db->select_sum('vat')->from('accounts')->where_in('type', 'Expenses')->where('date <=', $current_period)->where('date >=', $previous_period)->where('vat >=', 0);
$negative = $this->db->select_sum('vat')->from('accounts')->where_in('type', 'Expenses')->where('date <=', $current_period)->where('date >=', $previous_period)->where('vat <', 0);
$result = $positive + abs($negative);

请注意,第二个选项需要更长的时间才能完成,因为这是两个单独的查询。

答案 2 :(得分:0)

我在数据库级别上进行日期搜索时遇到了同样的问题 - 我能做的最好是使用ABS(),因为如果结果是过去的话,time_diff会返回负值。如果正在使用date_diff或TIME_DIFF,请使用:

TIME(ABS(TIMEDIFF(TIME(sch_Starts), TIME("22:00:00"))))

它接受可能的否定结果,通过ABS转换它并围绕它转换TIME()以转换回时间,如果你正在使用像我这样的时间特定函数。

可能乏味,但它可以100%运作

答案 3 :(得分:-1)

你总是可以尝试:

where table.field NOT LIKE '%-%'