私はこのサイトや他の人を探して、これに対する答えを見つけようとしました。いろんなことを試しましたが、答えがわからないので、いきます。ここに私のデータ:
私が必要なのは、各アカウントの物乞いから始めて、借方を追加し、クレジットを差し引き、その月(行)の期末残高を生成することです。 Acctが変更されたら、新しいbebbalを取り上げて、もう一度開始します。データは次のようになります。
これを実行することで、借方と貸方の現在の合計を取得できます。
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として
どうしてかわからない.
_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;
_
T-SQLとして記述されたサンプルデータについて HandyD に感謝します。
現在の合計を計算するには、再帰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