Sql 添加期初和期末余额列

Sql 添加期初和期末余额列,sql,crystal-reports,report,Sql,Crystal Reports,Report,我有一张这样的桌子: 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 Clini

我有一张这样的桌子:

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
NB.年和月列是浮动列,并且希望将它们更改为日期格式

我是SQL和crystal reports的新手。我需要一个查询来帮助我完成开发包含期初余额和期末余额列的报告的任务,期初余额是以前的期末余额。

您可以这样做:

;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和
CURRENTMONTHBALANCE`如下:

  • 结清余额
    =

      [return] + rdj + rpo + xefr) -
      (adj+iss+piss+tsfr)
    
    每个月。我假设你的表中每个月都有一条记录

  • 期初余额
    :是上个月的
    期初余额
    ,按存货名称分组。这是通过使用(按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;
这将为您提供相同的输出


每个月的期末余额=期初余额+(return+rdj+rpo+xefr)-(adj+iss+piss+tsfr)。分组以每个诊所为例,因为我们有几个诊所。Msg 512,级别16,状态1,第1行子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。我在尝试运行脚本时遇到错误…我使用的是SQL 2005…我不想要当前月份的余额,但在报告中包含它可能是一件好事…我希望1月的期末余额作为示例为2月的期初余额。2月的计算将基于1月的期初余额作为示例示例。@user1862899-尝试使用
SUM
加入用户
就像我在编辑中所做的那样。请参阅我的最新答案。请注意,期末余额的计算方法与您描述的相同,请对其进行测试。每个月的期初余额=上个月的期末余额应该可以正常工作。查询运行正常,但我想去掉CurrentMonthBalance列,。。。。。。。我也希望是这样,如果是1月60日的期末余额,那么当我们计算2月的余额时,这60必须显示在它的列中。这更像是一个银行对账单账户之类的东西。它们会显示你上个月还剩下多少,并将该金额添加到当前余额中。谢谢,先生。@user1862899你的意思是在之前添加一个新列吗月结余额。你能不能用你已经处理过的数据样本来修改。按下按钮“Text To DDL”,然后用列名跳过数据,然后用这些数据创建一个新表,请解释所需的输出。到目前为止,您不需要
currentmonthBalance
列,closingBalance和OpeningBalance的计算方法是正确的。正确的?