2009-06-17 13 views
48

मेरे पास एक प्रश्न है जो दो वस्तुओं के बीच सभी वस्तुओं की कीमतों की गणना करता है। यहां चयन कथन है:SQL फ़ंक्शन से एकल मान प्राप्त करते समय मैं NULL को 0 कैसे बदल सकता हूं?

SELECT SUM(Price) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

आप मान सकते हैं कि सभी तालिकाओं को ठीक से स्थापित किया गया है।

अगर मैं दो तिथियों के बीच एक का चयन करते हैं और वहाँ उस समय अवधि के भीतर कोई आइटम नहीं है, समारोह शून्य TotalPrice बजाय 0.

कैसे मुझे यकीन है कि अगर कोई रिकॉर्ड पाया जाता है, 0 से कर सकते हैं के रूप में देता है नल के बजाय वापस आ जाता है?

उत्तर

84

अधिकांश डेटाबेस सर्वर एक COALESCE समारोह है, जो पहली तर्क यह है कि गैर-शून्य है वापस आ जाएगी है, तो निम्न आप क्या चाहते हैं करना चाहिए:

SELECT COALESCE(SUM(Price),0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

[संपादित करें]

बस स्पष्ट करने के लिए चीजें "COALESCE/ISNULL के बारे में बहुत सी चर्चाएं होती हैं, यदि कोई पंक्तियां मेल नहीं खाती हैं, तो इस क्वेरी को आजमाएं, इस क्वेरी को आजमाएं:

SELECT coalesce(SUM(column_id),0) AS TotalPrice 
FROM sys.columns 
WHERE (object_id BETWEEN -1 AND -2) 

ध्यान दें कि जहां खंड sys.columns से सभी पंक्तियों को विचाराधीन करता है, लेकिन 'योग' ऑपरेटर का परिणाम अभी भी एक पंक्ति में लौटाया जाता है जो शून्य है, जो कोलेसस 0/

के साथ एक पंक्ति होने के लिए ठीक करता है

मुझे आशा है कि इससे इसकी व्याख्या करने में मदद मिलेगी।

+0

यदि आप कोई प्रश्न नहीं देखते हैं तो वह 0 को वापस लौटाता है, तो यह केवल तभी काम करेगा जब योग का परिणाम शून्य है – Tetraneutron

+0

@Tetraneutron: मुझे लगता है कि यह काम करेगा। यदि कोई पंक्ति नहीं है तो राशि (मूल्य) शून्य होगी, लेकिन हमेशा एक परिणाम पंक्ति होगी। – Thilo

+0

COALESCE तब तक ठीक काम करता है जब आप इसे चलाने के लिए एक पंक्ति वापस प्राप्त कर रहे हैं (जो आप इस मामले में करते हैं)। यदि आपको कोई पंक्ति वापस नहीं मिलती है तो COALESCE आपकी सहायता नहीं करेगा। –

12
SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

यह चाल चलाना चाहिए।

6

संपादित करें: हर किसी की तरह मुझे यह करने के लिए हरा haha ​​

मिले जवाब लग रहा है।

ISNULL() निर्धारित करता है कि आपके पास शून्य मूल्य होने पर क्या करना है।

इस मामले में मेरा फ़ंक्शन एक शून्य मान देता है इसलिए मुझे इसके बदले में 0 को निर्दिष्ट करने की आवश्यकता होती है।

SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded 
BETWEEN @StartDate AND @EndDate) 
+0

isnull या coalesce काम करेगा – BlackTigerX

+0

मेरा मानना ​​है कि IFNULL MySQL समकक्ष है, और ISNULL एमएस 'टी-एसक्यूएल के लिए है । – ojrac

+1

आप जो भी करने की कोशिश कर रहे हैं उसके लिए आपके पास ISNULL स्टेटमेंट पीछे है। मुझे लगता है कि आप इसे इसके बजाय चाहते हैं: SUM (ISNULL (मूल्य, 0)) – JohnFx

9
SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 
+0

यह यह करेगा – Tetraneutron

+0

मैंने इसे एक खाली तालिका के साथ परीक्षण किया और यह आरबीरी ... – CodeRedick

+0

नीचे मेरा उत्तर देखें। बस प्रत्येक पंक्ति के लिए, फिर योग के लिए, ISNULL (या COALESCE) दो बार उपयोग करें। ISNULL चुनें (एसयूएम (ISNULL (मूल्य, 0)), 0)) – dkretz

3

आप

SELECT ISNULL(SUM(ISNULL(Price, 0)), 0) इस्तेमाल कर सकते हैं।

मुझे 99% यकीन है कि काम करेगा।

+5

आंतरिक आईएसएनयूएलएल की आवश्यकता नहीं है, क्योंकि एसयूएम केवल नल मानों को अनदेखा कर देगा। – sayap

5
SELECT COALESCE(
    (SELECT SUM(Price) AS TotalPrice 
    FROM Inventory 
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate)) 
    , 0) 

यदि तालिका में प्रतिक्रिया में पंक्तियां हैं तो यह एसयूएम (मूल्य) देता है। यदि एसयूएम न्यूल है या कोई पंक्ति नहीं है तो यह 0 लौटाएगा।

कोल्सेस (एसयूएम (मूल्य), 0) डालकर एमएसएसएलएल में काम नहीं करता है यदि कोई पंक्ति नहीं मिलती है।

+0

बेशक यह आपको सूची तालिका से एक समय में एक से अधिक मूल्य प्राप्त करने से रोकता है। – Paul

1

ओरेकल/PLSQL:

NVL फंक्शन

SELECT NVL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

यह SQL विवरण 0 वापसी अगर SUM(Price) एक अशक्त मान दिया जाएगा। अन्यथा, यह SUM(Price) मान वापस करेगा।

-5

ऐसा करने का सबसे आसान तरीका सिर्फ आपके परिणाम में शून्य जोड़ना है।

अर्थात

$A=($row['SUM'Price']+0); 
echo $A; 

आशा है कि यह मदद करता है !!

+1

यह काम कर सकता है यदि विषय स्टार्टर के पास परिणामों की व्याख्या करने के लिए एक PHP कोड है, लेकिन यदि प्रश्न SQL तक सीमित है, तो यह उत्तर के रूप में नहीं होगा। – Vesper

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

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