1

次のようなテーブルがあります。

StockNumber|InventoryName|Year|Month|Adj|iss|piss|Tsfr|return|rdj|rpo|xefr
alb001      clinic1       2010  1     4   5    5   5    6      5   4   10
alb001      Clinic1       2010  2    10  2    2    3    3      4   4   4
alb001      Clinic1       2010  4    11  3   5    77    90     78   9   6
alb001      Clinic1       2010  5    10  2    2    3    3      4   4   4

決算残高列を追加したい

sum(return+rdj+rpo+xefr) - sum(adj+iss+piss+tsfr)

また、前月の決算残高となる期首残高列も追加したいと思います。

次に、現在の月の残高を次のように計算します。

OpeningBalance + sum(return+rdj+rpo+xefr) - sum(adj+iss+piss+tsfr) = ClosingBalance

注意。年と月の列はフロートであり、日付形式に変更したいと考えています。

私は SQL と Crystal レポートの初心者です。期首残高と期末残高を含むレポートを作成するタスクを達成するのに役立つクエリが必要です。期首残高は前の期末残高です。

4

1 に答える 1

2

あなたはこれを行うことができます:

;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;

SQLフィドルデモ

これはあなたに与えるでしょう:

| 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 |

このクエリはどのように機能しますか?

このクエリは、次のように、あなたの質問から理解できるようにCLOSINGBALANCEOPENINGBALANCE, andCURRENTMONTHBALANCE`を評価します。

  • 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;

これにより、同じ出力が得られます。

SQLフィドルデモ

于 2012-12-17T10:56:29.690 に答える