2015-06-10 46 views
1

我有2列的表:如何在SQL Server計算聚合產品功能

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 

我怎樣才能做到這一點?

+0

乘積列的確切計算方式是什麼? – kojow7

+0

您不應將計算列存儲在數據庫中。相反,請創建一個嵌套的select語句來爲您計算值。 – kojow7

回答

3

哦,這是一個痛苦。大多數數據庫不支持product聚合函數。你可以用日誌和權力模擬它。所以,這樣的事情可能工作:

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

注意log()可能在一些數據庫被稱爲ln()。此外,這適用於正數數字。處理負數和零的方法各不相同,但這使答案變得複雜(並且樣本數據都是正數)。

+0

@TommySayugo - 不,您可以在查詢中多次引用* same *表。當你這樣做的時候,你應該使用* aliases *('t','t2')來表示你指的是哪個表的實例。 –

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版本)。