2011-07-05 21 views
6

Tôi muốn truy vấn bảng đơn đặt hàng và hiển thị id khách hàng và tổng số đơn đặt hàng của mình, tuy nhiên đơn hàng có thể có tổng số âm hoặc dương.Truy vấn tập hợp SQL cho SUM, nhưng chỉ cho phép số tiền dương (nếu không 0)

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

Bây giờ câu hỏi của tôi - làm thế nào tôi có thể đạt được sau một sql truy vấn:

Nếu tổng số tiền là tích cực, tôi muốn hiển thị nó như là; nếu tổng số tiền âm, tôi chỉ muốn hiển thị 0 thay cho số tiền thực tế.

Điều tôi đang tìm là một hàm có thể xử lý điều này, tương tự như hàm IFNULL (IFNULL(SUM(order_total),0)), nhưng thay vì kiểm tra giá trị rỗng, nó sẽ kiểm tra kết quả âm.

Pseudo code:

IFNEGATIVE(SUM(order_total),0) 

Có một cách đơn giản trong sql chuẩn (hoặc cụ thể trong Mysql 5.5, cũng sẽ là ok).

Trả lời

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

Kiểm tra kế hoạch thực hiện của bạn, nhưng 2 SUM s có thể sẽ được tối ưu hóa để một SUM duy nhất dưới mui xe.

+0

Cảm ơn rất nhiều, tôi đã không sử dụng trường hợp trong sql thường, tốt để biết :) Tôi nghĩ rằng một số câu trả lời khác được cung cấp (tức là IF cũng làm việc), tuy nhiên, hãy để tôi chấp nhận phiếu bầu này ở đây, tôi cũng upvote những người khác. –

1

nếu tôi hiểu nó chỉ quấn nó với LỚN NHẤT

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

nhìn trên link

+0

Điều này sẽ chỉ tính các đơn hàng sở hữu. OP yêu cầu tổng của tất cả các đơn đặt hàng. –

+0

tôi cập nhật câu trả lời của tôi, bây giờ tôi hiểu những gì ông cần –

1

Bạn không thể sử dụng câu lệnh CASE?

Cái gì như:

CASE WHEN [Field] < 0 THEN 0 

Hoặc tôi đã bỏ lỡ một cái gì đó?

+0

bạn đã bỏ lỡ điều gì đó.đó là * tổng * không được âm - các hàng riêng lẻ có thể được trộn + ve và -ve miễn là tổng không phải là âm – Bohemian

+0

nó gần như cảm thấy quá đơn giản! Cảm ơn. – CatchingMonkey

3

Không thử nghiệm, nhưng một cái gì đó như thế này nên làm điều đó:

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

Để chỉ hiển thị Sử dụng tích cực HAVING như sau:

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

Nếu không sử dụng trường hợp như được liệt kê ở những nơi khác ở đây

+0

Điều đó sẽ giới hạn tìm kiếm của anh ta, nhưng nó sẽ không hiển thị 0 khi tổng là âm. – Vache

+0

Thực hiện hiểu sai "hiển thị số không" nhưng câu trả lời còn lại ở đây cho các trường hợp khác ... –

8

Hãy thử với :

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

+1 tôi thích nó - chỉ tính tổng một lần – Bohemian

+1

Tôi thích điều này tốt hơn cho khả năng đọc/bảo trì, nhưng nó nhanh chóng kiểm tra kết thúc của tôi cho một kịch bản tương tự cho thấy cùng một kế hoạch thực hiện trong SQL 2012 - SQL server có thể tìm ra rằng bạn thực sự chỉ cần nó một lần. –

+1

Và tôi nhận ra đây là một câu hỏi cũ và chỉ thấy rằng nó thực sự cho MySQL, nhưng điều này có vẻ như một tối ưu hóa treo khá thấp - tôi muốn đặt cược MySQL có thể làm điều đó là tốt. –

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

Bạn cũng có thể thử;

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

không nên là (tổng (fld) + tổng (abs ((fld)))/2 –

Các vấn đề liên quan