web-dev-qa-db-ja.com

月の行ごとに期末残高の累計を計算する必要がある期首残高があります

私はこのサイトや他の人を探して、これに対する答えを見つけようとしました。いろんなことを試しましたが、答えがわからないので、いきます。ここに私のデータ: beg_image

私が必要なのは、各アカウントの物乞いから始めて、借方を追加し、クレジットを差し引き、その月(行)の期末残高を生成することです。 Acctが変更されたら、新しいbebbalを取り上げて、もう一度開始します。データは次のようになります。 ![end_image

これを実行することで、借方と貸方の現在の合計を取得できます。

SELECT
pph.Acct,
pph.Year, 
pph.Prd,
pph.begbal,
pph.debit,
pph.credit,
SUM(pph.debit+pph.credit) OVER (PARTITION BY pph.Acct ORDER BY pph.Year, pph.Prd) AS endbal
FROM GL_PeriodPostingHistory pph

私がしたいのは

Acct <> prevoius Acctの場合
その後、Sum(begbal + debit-credit)
else Sum(前のendbal + debit-credit)をendbalとして

どうしてかわからない.

1
C.Smith

_FIRST_VALUE_ ウィンドウ関数をSUM(pph.debit-pph.credit)とともに使用して、目的の出力を取得できます。

_SELECT
pph.Acct,
pph.Year, 
pph.Prd,
pph.begbal,
pph.debit,
pph.credit,
FIRST_VALUE(pph.begbal) OVER (PARTITION BY pph.Acct ORDER BY pph.Year, pph.Prd)
    + SUM(pph.debit-pph.credit) OVER (PARTITION BY pph.Acct ORDER BY pph.Year, pph.Prd) AS endbal
FROM dbo.GL_PeriodPostingHistory pph;
_

dbフィドルリンク

T-SQLとして記述されたサンプルデータについて HandyD に感謝します。

2
Joe Obbish

現在の合計を計算するには、再帰CTEを使用する必要があります。基本的に、begbal +クレジット+借方の数式を使用して、各Acctグループの行1にendbalを設定し、そのアカウントの後続のすべての行で、前の行のendbal値をbegbal値に置き換えます。

セットアップ:

CREATE TABLE Accounts (
    Acct INT,
    Year INT,
    Prd INT,
    begbal INT,
    debit INT,
    credit INT
)
GO
INSERT INTO Accounts
VALUES (1, 2017, 1, -134, 0, 0),
(1, 2017, 10, 0, 0, 20),
(1, 2017, 11, 0, 0, 186),
(1, 2018, 1, -340, 17, 14),
(1, 2018, 4, 0, 0, 7),
(1, 2018, 6, 0, 0, 33),
(1, 2018, 12, 0, 0, 152),
(1, 2019, 1, -529, 0, 0),
(2, 2014, 1, 1000, 0, 0),
(2, 2015, 1, 1000, 0, 0),
(2, 2015, 5, 0, 0, 950),
(2, 2016, 1, 50, 0, 0),
(2, 2017, 1, 50, 0, 0),
(2, 2018, 1, 50, 0, 0),
(2, 2019, 1, 50, 0, 0)
GO

クエリ:

WITH AccountBalances AS (
    SELECT Acct,
        Year,
        Prd,
        begbal,
        debit,
        credit,
        ROW_NUMBER() OVER (PARTITION BY a1.Acct ORDER BY Year, Prd) AS Rn
    FROM Accounts a1
), RunningBalances AS (
    SELECT a1.Acct,
        a1.Year,
        a1.Prd,
        a1.begbal,
        a1.debit,
        a1.credit,
        a1.begbal + SUM(a1.debit + a1.credit) OVER (PARTITION BY a1.Acct ORDER BY a1.Year, a1.Prd) AS endbal,
        a1.rn
    FROM AccountBalances a1
    WHERE Rn = 1
    UNION ALL
    SELECT a1.Acct,
        a1.Year,
        a1.Prd,
        a1.begbal,
        a1.debit,
        a1.credit,
        a2.endbal + SUM(a1.debit + a1.credit) OVER (PARTITION BY a1.Acct ORDER BY a1.Year, a1.Prd) AS endbal,
        a1.rn
    FROM AccountBalances a1
    INNER JOIN RunningBalances a2 ON a2.Acct = a1.Acct AND a2.Rn = a1.Rn - 1
)

SELECT Acct,
    Year,
    Prd,
    begbal,
    debit,
    credit,
    endbal
FROM RunningBalances
ORDER BY Acct, Year, Prd

出力:

Acct    Year    Prd     begbal  debit   credit  endbal
------------------------------------------------------
1       2017    1       -134    0       0       -134
1       2017    10      0       0       20      -114
1       2017    11      0       0       186     72
1       2018    1       -340    17      14      103
1       2018    4       0       0       7       110
1       2018    6       0       0       33      143
1       2018    12      0       0       152     295
1       2019    1       -529    0       0       295
2       2014    1       1000    0       0       1000
2       2015    1       1000    0       0       1000
2       2015    5       0       0       950     1950
2       2016    1       50      0       0       1950
2       2017    1       50      0       0       1950
2       2018    1       50      0       0       1950
2       2019    1       50      0       0       1950
0
HandyD