Negativeণাত্মক এবং শূন্য মানযুক্ত কলামের জন্য সারিগুলি কীভাবে গুণাবেন?


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

সুতরাং সংক্ষিপ্তসারে ... আপনি কীভাবে একটি কলামে সারিগুলিকে গুন করবেন যেখানে negativeণাত্মক বা শূন্য মূল্যবান সংখ্যা থাকতে পারে?

উত্তর:


13

NULLIF এর যাদুটি আপনার প্রশ্নে পরীক্ষার কেসটি করার কৌশল বলে মনে হচ্ছে। যেহেতু আপনি আপনার এসকিউএল ফিডেলের চেয়ে আলাদা উদাহরণ ব্যবহার করেছেন, আপনি সেখানে কী চান তা আমার জানা নেই।

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প্রকাশটি প্রত্যাশার মতো কাজ করে নি, CASE (লেনদেন-এসকিউএল) এর জন্য ডকুমেন্টেশন থেকে (জোর দেওয়া হয়েছে):

যখন স্কালে এক্সপ্রেশন, (যে রিটার্ন scalars অ সম্পর্কিত উপ-প্রশ্নের সহ) অবস্থার আপনি শুধুমাত্র মূল্যায়ন ক্রম উপর নির্ভর করে করা উচিত সমষ্টিগত এক্সপ্রেশন জন্য নয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.