1

値の昇順に基づいて現在の合計を作成するのにまだ問題があります。行IDには実際の意味はなく、PKにすぎません。私のサーバーはOVERをサポートしていません。

Row Value
1 3
2 7
3 1
4 2

結果:

Row Value
3 1
4 3
1 6
2 13

2番目の量(合計される量)の値が最初の量の現在の値よりも小さいことを指定する自己結合とクロス結合を試しました。また、have句を使用してこれを実行しようとしましたが、そのように試行すると常にエラーが発生しました。誰かがそれをそのように使うのがなぜ間違っているのか、そして私がそれをどのようにすべきかを説明できますか?

4

3 に答える 3

2

累計を行う1つの方法は次のとおりです。

select row, value,
       (select sum(value) from t t2 where t2.value <= t.value) as runningTotal
from t
于 2012-09-05T14:25:40.340 に答える
0

SQL Server 2008を使用している場合は、withrollupコマンドを使用できます。

select sum(value) from t t2 where t2.value <= t.value with rollup
于 2012-09-05T14:33:29.210 に答える
0

プラットフォームが再帰クエリをサポートしている場合(IIRCでは、MicrosoftのもののRECURSIVEキーワードを省略する必要があります)。CTEは「チェーン」の開始/終了を推定する必要があるため、残念ながら、タプルは何らかの方法で順序付けする必要があります(「行」フィールドを使用します。この目的には、内部タプルIDが最適です)。

WITH RECURSIVE sums AS (
    -- Terminal part
    SELECT  d0.row
    , d0.value AS value
    , d0.value AS runsum
    FROM data d0
    WHERE NOT EXISTS (
        SELECT * FROM data nx
        WHERE nx.row < d0.row
        )
    UNION
    -- Recursive part
    SELECT  t1.row AS row
    , t1.value AS value
    , t0.runsum + t1.value AS runsum
    FROM data t1
    , sums t0
    WHERE t1.row > t0.row
    AND NOT EXISTS (
        SELECT * FROM data nx
        WHERE nx.row > t0.row
        AND nx.row < t1.row
        )
    )
SELECT * FROM sums
    ;

結果:

 row | value | runsum 
-----+-------+--------
   1 |     3 |      3
   2 |     7 |     10
   3 |     1 |     11
   4 |     2 |     13
(4 rows)
于 2012-09-05T16:33:25.367 に答える