假设我有一个如下表:
Numbers
4
5
3
6
使用基于SET的方法如何执行乘法,因此输出将为:
Output
360
N.B~没有严格的规则,只有四个数字,但我更喜欢使用CTE和/或相关子查询的答案。
答案 0 :(得分:9)
您可以使用利用以下数学事实的对数/指数:
log(a*b*c...*n)=log(a)+log(b)+log(c)...+log(n)
因此,您可以使用sum
函数添加列的所有对数,然后取该总和的指数,得到该列的聚合乘法:
create table #tbl (val int)
insert into #tbl (val) values(1)
insert into #tbl (val) values(2)
insert into #tbl (val) values(3)
insert into #tbl (val) values(4)
select exp(sum(log(val))) from #tbl
drop table #tbl
如果内存对我有用,那么需要注意一个边缘情况...... log(0)是一个错误。
答案 1 :(得分:2)
declare @result int
set @result = 1
select @result = @result * [number]
from tblNumber
print @result
(请注意,这假定为int列且没有溢出)
答案 2 :(得分:0)
迈克尔的结果非常有效。
您可以使用递归CTE,只需定义ROW_NUMBER和自连接即可。但是为什么要这么麻烦,因为你还需要进行表格或索引扫描。