好的,我有一个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);
答案 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 '%-%'