1

好的,所以我有一个 mySQL 值表。有些是积极的,有些是消极的。负数在表中前面有一个 -。我正在使用 Codeigniter。

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

例如,这就是它目前所做的:-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

4 回答 4

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);
于 2012-08-06T13:26:08.810 回答
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);

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

于 2012-08-06T13:29:46.993 回答
0

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

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

如果您使用像我这样的时间特定功能,它可能会产生负面结果,通过 ABS 将其转换并围绕 TIME() 将其转换回时间。

也许乏味,但它工作 100%

于 2014-09-05T06:09:34.503 回答
-2

你总是可以尝试:

where table.field NOT LIKE '%-%'
于 2014-09-18T18:10:23.660 回答