नकारात्मक और शून्य मान वाले कॉलम के लिए पंक्तियों को कैसे गुणा करें?


10

मैं क्वेरी द्वारा समूहीकृत एक विशिष्ट कॉलम के लिए सभी पंक्तियों का उत्पाद प्राप्त करने की कोशिश कर रहा हूं। सबसे अधिक उदाहरण मुझे मिला है जो मुझे संयोजन की ओर इशारा करता है exp, sumऔरlog

exp(sum(log([Column A])))

समस्या यह है कि कॉलम में मानों के लिए कुछ शून्य हैं और इस प्रकार मुझे यह त्रुटि तब हो रही है जब शून्य logफ़ंक्शन में पास हो जाता है:

एक अमान्य फ़्लोटिंग पॉइंट ऑपरेशन हुआ।

मैंने सोचा कि मैं इसके चारों ओर एक caseअभिव्यक्ति का उपयोग करके काम कर सकता हूं , लेकिन यह उस तरह से काम नहीं करता है जैसा मुझे लगता है कि इसे करना चाहिए, क्योंकि यह सभी मामलों का मूल्यांकन करता है ...

select 
  Name,
  Product = case 
    when min([Value]) = 0 then 0 
    when min([Value]) <> 0 then exp(sum(log(I))) -- trying to get the product of all rows in this column
  end
 from ids
 group by Name

SqlFiddle

निम्नलिखित परिणाम सेट को देखते हुए:

Id  Name  Value
_________________________________
1   a     1
2   a     2
3   b     0
4   b     1

मैं निम्नलिखित पंक्तियों को प्राप्त करने की उम्मीद करूंगा:

Name  Product
_____________
a     2
b     0

तो सारांश में ... आप एक स्तंभ में पंक्तियों को कैसे गुणा करते हैं जिसमें नकारात्मक या शून्य मूल्यवान संख्या हो सकती है?

जवाबों:


13

NULLIF का जादू आपके प्रश्न में परीक्षण मामले के लिए चाल करने के लिए लगता है। चूँकि आपने अपनी SQL Fiddle की तुलना में एक अलग उदाहरण का उपयोग किया है, मुझे नहीं पता कि क्या आप वहाँ चाहते हैं।

CREATE TABLE dbo.Ids
(
    Id INT NOT NULL IDENTITY(1, 1),
    Value INT,
    Name NVARCHAR(3)
);
INSERT INTO dbo.Ids ( Name, Value )
VALUES ( 'a', 1 );
INSERT INTO dbo.Ids ( Name, Value )
VALUES ( 'a', 2 );
INSERT INTO dbo.Ids ( Name, Value )
VALUES ( 'b', 0 );
INSERT INTO dbo.Ids ( Name, Value )
VALUES ( 'b', 1 );

SELECT   Name,
         CASE WHEN MIN(Value) = 0 THEN 0
              WHEN MIN(Value) > 0 THEN EXP(SUM(LOG(NULLIF(Value, 0)))) -- trying to get the product of all rows in this column
         END AS Product
FROM     Ids
GROUP BY Name;

यह दिखाता है:

Name    Product
a       2
b       0

यदि आपको अधिक सामान्य समाधान की आवश्यकता है जो नकारात्मक संख्या और अन्य किनारे के मामलों को संभालती है, तो उदाहरण के लिए देखें स्कॉट बर्को द्वारा टी-एसक्यूएल वर्सेस सीएलआर में उत्पाद को अलग करना। उस लेख से एक टी-एसक्यूएल निर्माण है:

EXP(SUM(LOG(NULLIF(ABS([Value]), 0))))
*
IIF(SUM(IIF([Value] = 0, 1, NULL)) > 0, 0, 1)
*
IIF(SUM(IIF([Value] < 0, 1, 0)) % 2 = 1, -1, 1)

CASE (Transact-SQL) केCASE लिए प्रलेखन से आपकी मूल अभिव्यक्ति अपेक्षा के अनुसार काम क्यों नहीं की गई (जोर जोड़ा गया):

आपको केवल स्केलर एक्सप्रेशन के लिए WHEN की स्थिति के मूल्यांकन के आदेश पर निर्भर होना चाहिए (गैर-सहसंबद्ध उप-प्रश्नों सहित, जो स्केलर को लौटाते हैं), एग्रीगेट भावों के लिए नहीं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.