2011-07-05 105 views
6

我想查詢一個訂單表並顯示客戶ID和他所有訂單的總數,但訂單可以有正數或負數總數。對於SUM的SQL聚合查詢,但只允許正數和(否則爲0)

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,也將是確定)。

回答

10
SELECT customer_id, 
    CASE 
    WHEN SUM(order_total) < 0 THEN 0 
    ELSE SUM(order_total) 
    END 
    FROM orders 
    GROUP BY customer_id; 

檢查你的執行計劃,但2 SUM旨意可能進行優化,以引擎蓋下單個SUM

+0

非常感謝,我經常沒有在sql中使用過例子,很高興知道:)我認爲提供了一些其他答案(即IF也可以),但是,讓我在這裏接受這個投票,我也贊成其他的投票。 –

1

如果我沒有理解其僅與GREATEST

SELECT customer_id, GREATEST(0,SUM(order_total)) 
FROM orders GROUP BY customer_id; 

看它包裝上的link

+0

這將只求和正式訂單。 OP要求所有訂單的總和。 –

+0

我更新了我的答案,現在我明白他需要什麼 –

1

你不能使用CASE語句嗎?

喜歡的東西:

CASE WHEN [Field] < 0 THEN 0 

還是我錯過了什麼?

+0

你錯過了什麼。它的*總和*不應該是負數 - 個別行可以混合+ ve和-ve只要總和不是負數 – Bohemian

+0

它幾乎感覺太簡單了!謝謝。 – CatchingMonkey

3

沒有測試,但是這樣的事情應該這樣做:

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

要只顯示正使用具有這樣的:

select customer_id, SUM(order_total) from orders group by customer_id HAVING SUM(order_total) > 0; 

否則,使用所列的其他地方在這裏

+0

這將限制他的搜索,但當總和爲負時,它不會顯示0。 – Vache

+0

意識到'顯示零',但留下回答在這裏爲其他情況... –

8

與嘗試的情況下:

select customer_id, GREATEST(SUM(order_total),0) from orders group by customer_id; 
+1

+1我喜歡它 - 只做一次總和 – Bohemian

+1

我更喜歡這一點以及可讀性/可維護性,但它是一個快速檢查對於類似場景,我的結尾顯示了SQL 2012中的相同執行計劃 - SQL Server可以發現您真的只需要它一次。 –

+1

我意識到這是一個古老的問題,只是看到它實際上是用於MySQL,但這看起來像是一個非常低的掛起優化 - 我敢打賭,MySQL也可以做到這一點。 –

0
select Id,case when (sum(amount)<0) then 0 else sum(amount) end from tblsum group by Id 
0

你也可以試試;

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

不應該是(sum(fld)+ sum(abs((fld)))/ 2 –

相關問題