mae*_*sto 27 sql sql-server oracle
在SQL中有聚合运算符,如AVG,SUM,COUNT.为什么它没有乘法运算符?"MUL"或其他东西.
我想知道,Oracle,MSSQL,MySQL是否存在?如果没有,是否有解决方法会产生这种行为?
Ric*_*iwi 44
通过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 )
Run Code Online (Sandbox Code Playgroud)
为了完整起见,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)))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
配料:
1 for >0
,0 for 0
和-1 for <0
.% 2
反对count()的负数返回0.5-1=-0.5
=> round to -1)如果有一个奇数个负数0.5-0= 0.5
=>舍入为 1)如果有偶数个负数Kon*_*rak 25
不,但你可以使用数学:)
如果yourColumn
总是大于零:
select EXP(SUM(LOG(yourColumn))) As ColumnProduct from yourTable
Run Code Online (Sandbox Code Playgroud)
我看到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.
Run Code Online (Sandbox Code Playgroud)
问候,
Rob.