如何计算SQL Server中的聚合产品功能

时间:2015-06-10 02:32:23

标签: sql sql-server sum aggregate-functions exp

我有一个包含2列的表:

No.  Name    Serial
1    Tom       1
2    Bob       5
3    Don       3
4    Jim       6

我想添加一个内容为多个串行列的列,如下所示:

No.  Name    Serial   Multiply
1    Tom       2         2
2    Bob       5         10
3    Don       3         30
4    Jim       6         180

我该怎么做?

2 个答案:

答案 0 :(得分:3)

哦,这是一种痛苦。大多数数据库不支持product聚合函数。您可以使用日志和权限来模拟它。所以,这样的事情可能有用:

select t.*,
       (select exp(sum(log(serial)))
        from table t2
        where t2.no <= t.no
       ) as cumeProduct
from table t;

请注意,log()在某些数据库中可能被称为ln()。此外,这适用于数字。处理负数和零有变化,但这使得答案变得复杂(并且样本数据都是正数)。

答案 1 :(得分:1)

创建CLR聚合并不是那么糟糕。我在大约5分钟内把它掀起:

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)]
public struct Product
{
    private SqlDouble _p;
    public void Init()
    {
        this._p = new SqlDouble(1);
    }

    public void Accumulate(SqlDouble Value)
    {
        this._p *= Value;
    }

    public void Merge (Product Group)
    {
        this._p *= Group._p;
    }

    public SqlDouble Terminate ()
    {
        // Put your code here
        return _p;
    }
}

一旦你得到了它,你就可以使用通常用于运行总和的技术(即三角形连接或界定行的窗口定义,具体取决于你的sql版本)。