Negatif ve sıfır değerleri içeren bir sütun için satırlar nasıl çarpılır?


10

Sorguya göre gruplandırılmış belirli bir sütun için tüm satırların ürün almaya çalışıyorum. Ben birleştirerek doğru noktası beni buldum Çoğu örnekler exp, sumvelog

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

Sahip olduğum sorun sütun değerleri için bazı sıfırlar içerir ve bu nedenle sıfırlar logişleve geçtiğinde bu hatayı alıyorum :

Geçersiz bir kayan nokta işlemi oluştu.

Bir caseifade kullanarak bu sorunu çözebileceğimi düşündüm , ancak bu tüm vakaları değerlendiriyor gibi göründüğü gibi çalışmaz ...

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

Aşağıdaki sonuç kümesi verildiğinde:

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

Aşağıdaki satırları almayı beklerim:

Name  Product
_____________
a     2
b     0

Özet olarak ... Bir sütundaki negatif veya sıfır değerli sayılar içeren satırları nasıl çarparsınız?

Yanıtlar:


13

NULLIF'in büyüsü, sorunuzdaki test vakası için hile yapıyor gibi görünüyor. SQL Fiddle'ınızdan farklı bir örnek kullandığınız için, orada da istediğiniz şey olup olmadığını bilmiyorum.

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;

İadeler:

Name    Product
a       2
b       0

Negatif sayıları ve diğer uç durumları işleyen daha genel bir çözüme ihtiyacınız varsa, bkz . Scott Burkow'un CLR'ye karşı T- SQL'deki Ürün Toplaması. Bu makaleden bir T-SQL yapısı:

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)

Orijinal CASEifadenizin neden beklendiği gibi çalışmadığına gelince , CASE (Transact-SQL) belgelerinden (vurgu eklendi):

Toplam ifadeler için değil , yalnızca skaler ifadeler için WHEN koşullarının (skaleri döndüren korelasyonlu olmayan alt sorgular dahil) değerlendirme sırasına bağlı olmalısınız .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.