我正在寻找SELECT PRODUCT(table.price) FROM table GROUP BY table.sale
类似于SUM
工作方式的东西.
我是否遗漏了文档中的内容,或者确实没有PRODUCT
功能?
如果是这样,为什么不呢?
注意:我在postgres,mysql和mssql中查找了函数,发现没有,所以我假设所有的sql都不支持它.
gbn*_*gbn 50
对于MSSQL,您可以使用它.它可以用于其他平台:它只是数学和对数的聚合.
SELECT
GrpID,
CASE
WHEN MinVal = 0 THEN 0
WHEN Neg % 2 = 1 THEN -1 * EXP(ABSMult)
ELSE EXP(ABSMult)
END
FROM
(
SELECT
GrpID,
--log of +ve row values
SUM(LOG(ABS(NULLIF(Value, 0)))) AS ABSMult,
--count of -ve values. Even = +ve result.
SUM(SIGN(CASE WHEN Value < 0 THEN 1 ELSE 0 END)) AS Neg,
--anything * zero = zero
MIN(ABS(Value)) AS MinVal
FROM
Mytable
GROUP BY
GrpID
) foo
Run Code Online (Sandbox Code Playgroud)
取自我的答案:SQL Server查询 - 分组乘法
one*_*hen 26
PRODUCT
SQL Standard中没有set函数.它似乎是一个有价值的候选者(不像,例如,一个CONCATENATE
集函数:它不适合SQL,例如,结果数据类型将涉及多值并且就第一范式形成问题).
SQL标准旨在整合1990年左右的SQL产品功能,并为未来的发展提供"思想领导力".简而言之,它们记录了SQL的作用以及SQL应该做什么.没有PRODUCT
设定功能表明,1990年没有供应商,虽然它值得包含,并且没有学术兴趣将其引入标准.
当然,供应商总是试图添加自己的功能,这些天通常作为标准的扩展而不是切线.我不记得PRODUCT
在我使用的任何SQL产品中看到了一个集合函数(甚至需要一个函数).
在任何情况下,解决办法是相当简单的使用log
和exp
标量函数(和逻辑来处理底片)与SUM
组功能; 有关示例代码,请参阅@ gbn的答案.不过,我从来不需要在商业应用程序中这样做.
总之,我最好的猜测是SQL终端用户对PRODUCT
set函数没有要求; 此外,任何具有学术兴趣的人都可能会找到可接受的解决方法(即不会重视一PRODUCT
组函数会提供的语法糖).
出于兴趣,SQL Server Land确实需要新的集合函数,但对于窗口函数种类(以及标准SQL)也是如此.有关详细信息,包括如何参与进一步的驾驶需求,请参阅Itzik Ben-Gan的博客.
Lor*_*ter 25
我不知道为什么没有一个,但(更多地关注负数)你可以使用日志和指数来做: -
select exp (sum (ln (table.price))) from table ...
Run Code Online (Sandbox Code Playgroud)
你可以执行产品聚合功能,但你必须自己做数学运算,就像这样......
SELECT
Exp(Sum(IIf(Abs([Num])=0,0,Log(Abs([Num])))))*IIf(Min(Abs([Num]))=0,0,1)*(1-2*(Sum(IIf([Num]>=0,0,1)) Mod 2)) AS P
FROM
Table1
Run Code Online (Sandbox Code Playgroud)
来源:http://productfunctionsql.codeplex.com/
T-SQL中有一个巧妙的技巧(不确定它是否为ANSI)允许将一组行中的字符串值连接成一个变量.看起来它也适用于倍增:
declare @Floats as table (value float)
insert into @Floats values (0.9)
insert into @Floats values (0.9)
insert into @Floats values (0.9)
declare @multiplier float = null
select
@multiplier = isnull(@multiplier, '1') * value
from @Floats
select @multiplier
Run Code Online (Sandbox Code Playgroud)
这可能比log/exp解决方案在数值上更稳定.