Logarathm/power-metoden är den allmänt använda metoden. För Oracle, det vill säga:
select exp(sum(ln(col)))
from table;
Jag vet inte varför de ursprungliga databasdesignerna inte inkluderade PRODUCT()
som en aggregeringsfunktion. Min bästa gissning är att de alla var datavetare, utan statistiker. Sådana funktioner är mycket användbara i statistik, men de dyker inte upp mycket inom datavetenskap. De kanske inte ville ta itu med spillproblem, som en sådan funktion skulle innebära (särskilt på heltal).
Förresten, den här funktionen saknas i de flesta databaser, även de som implementerar många statistiska aggregeringsfunktioner.
redigera:
Oj, problemet med negativa siffror gör det lite mer komplicerat:
select ((case when mod(sum(sign(col)), 2) = 0 then 1 else -1 end) *
exp(sum(ln(abs(col))))
) as product
Jag är inte säker på ett säkert sätt i Oracle att hantera 0
s. Detta är ett "logiskt" tillvägagångssätt:
select (case when sum(case when col = 0 then 1 else 0 end) > 0
then NULL
when mod(sum(sign(col)), 2) = 0
then exp(sum(ln(abs(col)))
else - exp(sum(ln(abs(col)))
end)
) as product
Problemet är att databasmotorn kan få ett fel i loggen innan case
körs påstående. Det råkar vara så SQL Server fungerar. Jag är inte säker på Oracle.
Ah, det här kanske fungerar:
select (case when sum(case when col = 0 then 1 else 0 end) > 0
then NULL
when mod(sum(sign(col)), 2) = 0
then exp(sum(ln(case when col <> 0 then abs(col) end)))
else - exp(sum(ln(case when col <> 0 then abs(col) end)))
end)
) as product
Den returnerar NULL
när det finns en 0
.