あなたはこれを行うことができます:
;WITH WithClosingBalances
AS
(
SELECT
[StockNumber],
[InventoryName],
[Year],
[Month],
[Adj],
[iss],
[piss],
[Tsfr],
[return],
[rdj],
[rpo],
[xefr],
([return] + rdj + rpo + xefr) -
(adj+iss+piss+tsfr) ClosingBalance,
ROW_NUMBER() OVER(PARTITION BY INVENTORYNAME
ORDER BY month) rownum
FROM table1
), WithOpeningBalances
AS
(
SELECT
[StockNumber],
[InventoryName],
[Year],
[Month],
[Adj],
[iss],
[piss],
[Tsfr],
[return],
[rdj],
[rpo],
[xefr],
ClosingBalance,
ISNULL((SELECT ClosingBalance
FROM WithClosingBalances c2
WHERE c1.rownum - c2.rownum =1
), 0) OpeningBalance,
rownum
FROM WithClosingBalances c1
)
SELECT
[StockNumber],
[InventoryName],
[Year],
[Month],
[Adj],
[iss],
[piss],
[Tsfr],
[return],
[rdj],
[rpo],
[xefr],
ClosingBalance,
OpeningBalance,
OpeningBalance + ClosingBalance AS CurrentMonthBalance
FROM WithOpeningBalances;
これはあなたに与えるでしょう:
| STOCKNUMBER | INVENTORYNAME | YEAR | MONTH | ADJ | ISS | PISS | TSFR | RETURN | RDJ | RPO | XEFR | CLOSINGBALANCE | OPENINGBALANCE | CURRENTMONTHBALANCE |
------------------------------------------------------------------------------------------------------------------------------------------------------------
| alb001 | clinic1 | 2010 | 1 | 4 | 5 | 5 | 5 | 6 | 5 | 4 | 10 | 6 | 0 | 6 |
| alb001 | Clinic1 | 2010 | 2 | 10 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | -2 | 6 | 4 |
| alb001 | Clinic1 | 2010 | 4 | 11 | 3 | 5 | 77 | 90 | 78 | 9 | 6 | 87 | -2 | 85 |
| alb001 | Clinic1 | 2010 | 5 | 10 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | -2 | 87 | 85 |
このクエリはどのように機能しますか?
このクエリは、次のように、あなたの質問から理解できるようにCLOSINGBALANCE
、OPENINGBALANCE, and
CURRENTMONTHBALANCE`を評価します。
CLOSINGBALANCE
=
[return] + rdj + rpo + xefr) -
(adj+iss+piss+tsfr)
毎月。私はあなたのテーブルの各レコードを毎月と仮定しました。
OPENINGBALANCE
:は、CLOSINGBALANCE
インベントリ名でグループ化された前月のです。これは、を使用して行われROW_NUMBER() OVER(PARTITION BY InventoryName)
ます。
CURRENTMONTHBALANCE
=OpeningBalance + ClosingBalance
レコードごと。
更新:次JOIN
のように複数の月のエントリがあった場合は、相関サブクエリの代わりに使用できます。
;WITH WithClosingBalances
AS
(
SELECT
[StockNumber],
[InventoryName],
[Year],
[Month],
[Adj],
[iss],
[piss],
[Tsfr],
[return],
[rdj],
[rpo],
[xefr],
([return] + rdj + rpo + xefr) -
(adj+iss+piss+tsfr) ClosingBalance,
ROW_NUMBER() OVER(PARTITION BY INVENTORYNAME
ORDER BY month) rownum
FROM table1
), WithOpeningBalances
AS
(
SELECT
[StockNumber],
[InventoryName],
[Year],
[Month],
[Adj],
[iss],
[piss],
[Tsfr],
[return],
[rdj],
[rpo],
[xefr],
c1.ClosingBalance,
ISNULL(c2.ClosingBalance, 0) OpeningBalance
FROM WithClosingBalances c1
LEFT JOIN
(
SELECT rownum, SUM(ClosingBalance) ClosingBalance
FROM WithClosingBalances
GROUP BY rownum
) c2 ON c1.rownum - c2.rownum = 1
)
SELECT
[StockNumber],
[InventoryName],
[Year],
[Month],
[Adj],
[iss],
[piss],
[Tsfr],
[return],
[rdj],
[rpo],
[xefr],
ClosingBalance,
OpeningBalance,
OpeningBalance + ClosingBalance AS CurrentMonthBalance
FROM WithOpeningBalances;
これにより、同じ出力が得られます。