为了账号安全,请及时绑定邮箱和手机立即绑定

SQL中的乘法聚合运算符

/ 猿问

SQL中的乘法聚合运算符

喵喵时光机 2019-12-04 10:01:44

在SQL中,有聚合运算符,例如AVG,SUM,COUNT。为什么没有乘法运算符?“ MUL”之类的。

我想知道,对于Oracle,MSSQL,MySQL是否存在?如果没有,一种解决方法可以解决这个问题?


查看完整描述

3 回答

?
慕虎7371278

MUL是指值的渐进乘法?


即使有100个较小的行(例如10s),您的MUL(列)也会溢出任何数据类型!由于滥用/滥用的可能性很高,并且使用范围非常有限,因此不必成为SQL标准。正如其他人所展示的那样,有许多数学方法可以解决该问题,就像有很多方法可以使用标准(和通用)方法在SQL中进行棘手的计算一样。


样本数据:


Column

1

2

4

8


COUNT : 4 items (1 for each non-null)

SUM   : 1 + 2 + 4 + 8 = 15

AVG   : 3.75 (SUM/COUNT)

MUL   : 1 x 2 x 4 x 8 ? ( =64 )

为了完整起见,Oracle,MSSQL,MySQL核心实现*


Oracle : EXP(SUM(LN(column)))   or  POWER(N,SUM(LOG(column, N)))

MSSQL  : EXP(SUM(LOG(column)))  or  POWER(N,SUM(LOG(column)/LOG(N)))

MySQL  : EXP(SUM(LOG(column)))  or  POW(N,SUM(LOG(N,column)))

注意在SQL Server中使用EXP / LOG时,请注意返回类型http://msdn.microsoft.com/zh-cn/library/ms187592.aspx

POWER表单允许使用更大的数字(使用比Euler的数字大的基数),并且如果结果增长太大而无法使用POWER将其返回,则可以只返回对数值并在SQL查询之外计算实际数字

* LOG(0)和LOG(-ve)未定义。下面仅显示如何在SQL Server中处理此问题。可以使用相同的概念找到其他SQL风格的等效项


create table MUL(data int)

insert MUL select 1 yourColumn union all

           select 2 union all

           select 4 union all

           select 8 union all

           select -2 union all

           select 0


select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE

       EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics

     * round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives

       END

from MUL

配料:


取数据的abs(),如果最小值为0,再乘以其他无用的结果,则结果为0

当数据为0时,NULLIF将其转换为null。abs(),log()均返回null,从而使它从sum()中被排除

如果数据不为0,则abs允许我们使用LOG方法将一个负数乘以-我们将跟踪其他地方的负数

制定最终的征兆

签(数据)返回1 for >0,0 for 0和-1 for <0。

我们再加上0.5并再次使用sign(),因此现在将0和1都归为1,而只有-1归为-1。

再次使用NULLIF从COUNT()中删除1,因为我们只需要计算负数。

% 2 对负数的count()返回

->如果负数为奇数则为1

->如果负数为偶数则为0

更多数学技巧:我们将0.5取1或0,这样上面就变成

->(0.5-1=-0.5=>舍入为-1)如果有奇数个负数

->(0.5-0= 0.5=>舍入为 1)如果有偶数个负数

我们将最终的1 / -1与SUM-PRODUCT值相乘得出真实结果


查看完整回答
反对 回复 2019-12-04
?
郎朗坤

不,但是您可以使用数学:)


如果yourColumn始终大于零:


select EXP(SUM(LOG(yourColumn))) As ColumnProduct from yourTa


查看完整回答
反对 回复 2019-12-04
?
慕丝7291255

我看到仍然缺少Oracle答案,所以这里是:


SQL> with yourTable as

  2  ( select 1 yourColumn from dual union all

  3    select 2 from dual union all

  4    select 4 from dual union all

  5    select 8 from dual

  6  )

  7  select EXP(SUM(LN(yourColumn))) As ColumnProduct from yourTable

  8  /


COLUMNPRODUCT

-------------

           64


1 row selected.


查看完整回答
反对 回复 2019-12-04

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信