1

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

どうやってやるの?

4

2 に答える 2

3

ああ、これは痛いです。productほとんどのデータベースは集計関数をサポートしていません。ログとパワーでエミュレートできます。したがって、次のようなものが機能する可能性があります。

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

一部のデータベースlog()で呼び出される可能性があることに注意してください。ln()また、これはの数に対しても機能します。負の数とゼロを処理するバリエーションがありますが、これは答えを複雑にします (そして、サンプル データはすべて正です)。

于 2015-06-10T02:36:12.590 に答える
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 のバージョンに応じて、三角結合または行を制限するウィンドウ定義)。

于 2015-06-10T13:02:55.490 に答える