2012-08-06 78 views
1

好吧,我有一個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); 
+5

你可以使用 「SUM(ABS())」 – Shubhansh 2012-08-06 13:26:12

回答

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正,將負數轉正。注意:select()語句中的false停止自動轉義字段的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); 
+0

唉唉是你的第二一個使用ABS()工作太棒了。謝謝! – 2012-08-06 13:43:55

+0

@NoahGoodrich沒問題!很高興起作用=] – newfurniturey 2012-08-06 13:47:27

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); 

請注意,第二個選項需要更長的時間才能完成,因爲這是兩個單獨的查詢。

0

我有同樣的問題做一個數據庫級日期搜索 - 最好我可以做的是使用ABS(),因爲如果結果是過去,time_diff返回負值。

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

需要的可能是陰性結果,通過ABS轉換它,敷的時間()周圍如果u使用的是像我的時間特定的功能轉換回時間:如果與date_diff或TIME_DIFF使用該工作。

乏味也許,但它的工作原理100%

-1

你總是可以嘗試:

where table.field NOT LIKE '%-%'