クエリでグループ化された特定の列のすべての行の積を取得しようとしています。私が見つけたほとんどの例は、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
次の結果セットがあるとします。
Id Name Value
_________________________________
1 a 1
2 a 2
3 b 0
4 b 1
次の行が表示されると思います。
Name Product
_____________
a 2
b 0
要約すると...負またはゼロの値を含むことができる列の行をどのように乗算しますか?
[〜#〜] 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
負の数やその他のEdgeケースを処理するより一般的なソリューションが必要な場合は、たとえば、スコットバーコウによる T-SQLとCLRの製品集計 を参照してください。その記事のT-SQLの構成の1つは次のとおりです。
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条件の評価順序のみに依存する必要があります集約式ではありません 。