2011-07-05 10 views
6

मैं ऑर्डर टेबल से पूछताछ करना चाहता हूं और ग्राहक आईडी और उसके सभी ऑर्डर दिखा सकता हूं, हालांकि ऑर्डर सकारात्मक या नकारात्मक योग हो सकते हैं।एसयूएम के लिए एसक्यूएल एकत्रीकरण क्वेरी, लेकिन केवल सकारात्मक रकम (अन्यथा 0)

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

अब मेरे सवाल - कैसे मैं एक एसक्यूएल में निम्न क्वेरी को प्राप्त कर सकते हैं:

तो कुल योग सकारात्मक है, मैं इसे प्रदर्शित करने के लिए है के रूप में चाहते हैं; यदि कुल योग ऋणात्मक है, तो मैं केवल वास्तविक राशि के बजाय 0 प्रदर्शित करना चाहता हूं।

क्या मैं देख रहा हूँ एक समारोह है कि इस, IFNULL समारोह (IFNULL(SUM(order_total),0)) के समान है, लेकिन नल के लिए जाँच करने के बजाय, यह एक नकारात्मक परिणाम के लिए जाँच करनी चाहिए संभाल सकता है।

छद्म कोड:

IFNEGATIVE(SUM(order_total),0) 

वहाँ मानक एसक्यूएल में एक आसान तरीका है (या विशेष रूप से 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; 

पर साथ सबसे बड़ी

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

नज़र लपेट अपनी कार्य योजना लागू की जाँच करें, लेकिन 2 SUM रों शायद करने के लिए अनुकूलित किया जाएगा हुड के नीचे एक SUM

+0

धन्यवाद बहुत धन्यवाद, मैंने अक्सर एसक्यूएल में मामलों का उपयोग नहीं किया है, मुझे पता है :) मुझे लगता है कि प्रदान किए गए कुछ अन्य उत्तरों (यानी अगर यह भी काम करता है), हालांकि, चलो मैं यहां इस वोट को स्वीकार करता हूं, मैं अन्य लोगों को भी ऊपर उठाता हूं। –

1

अगर मैं अपने को समझने केवल link

+0

यह केवल संभावित ऑर्डर मिलेगा। ओपी सभी आदेशों के योग के लिए पूछता है। –

+0

मैं अपना उत्तर अपडेट करता हूं, अब मैं समझता हूं कि उसे –

1

क्या आप एक केस स्टेटमेंट का उपयोग नहीं कर सकते?

कुछ की तरह:

CASE WHEN [Field] < 0 THEN 0 

या मैं कुछ याद किया?

+0

आप कुछ याद किया।यह * योग * है जो ऋणात्मक नहीं होना चाहिए - व्यक्तिगत पंक्तियों को मिश्रित किया जा सकता है + और जब तक योग नकारात्मक नहीं है – 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

इससे उसकी खोज सीमित हो जाएगी, लेकिन यह योग प्रदर्शित नहीं होगा जब योग ऋणात्मक होगा। – Vache

+0

'डिस्प्ले शून्य' को गलत समझा गया लेकिन अन्य मामलों के लिए यहां उत्तर दिया गया ... –

8

साथ प्रयास करें :

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

+1 मुझे यह पसंद है - केवल – Bohemian

+1

पर एक बार राशि मिलती है, मुझे पठनीयता/रखरखाव के लिए यह बेहतर भी पसंद है, लेकिन यह एक त्वरित जांच है इसी तरह के परिदृश्य के लिए मेरा अंत एसक्यूएल 2012 में एक ही निष्पादन योजना दिखाता है - एसक्यूएल सर्वर यह पता लगा सकता है कि आपको वास्तव में केवल एक बार इसकी आवश्यकता है। –

+1

और मुझे एहसास है कि यह एक पुराना सवाल है और मैंने देखा कि यह वास्तव में MySQL के लिए है, लेकिन यह एक बहुत ही कम लटकती अनुकूलन की तरह लगता है - मैं शर्त लगाता हूं कि MySQL भी ऐसा कर सकता है। –

0

आप भी कोशिश कर सकते हैं;

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

यह नहीं होना चाहिए (योग (एफएलडी) + योग (abs ((fld)))/2 –

संबंधित मुद्दे