【问题标题】:Running totals to be reset on every change of Account number每次更改帐号时都会重置运行总计
【发布时间】:2013-04-04 06:20:36
【问题描述】:

表格具有如下所示的数据。它包含两个帐号的数据

P_ID AcctNo 日期 金额 1 111A 04/03/2011 -331 2 111A 04/03/2011 600 3 111A 04/03/2011 20000 4 111A 05/03/2011 -20000 5 111A 10/03/2011 -260 6 111B 01/08/2011 2 7 111B 12/09/2012 500 8 111B 13/09/2012 -166 9 111B 13/09/2012 -225

我正在寻找一个查询,以提供如下所示的运行总计(运行总计在帐户更改时重置):

P_ID AcctNo 日期 金额 运行总计 1 111A 04/03/2011 -331 -331 2 111A 04/03/2011 600 269 3 111A 04/03/2011 20000 20269 4 111A 05/03/2011 -20000 269 5 111A 10/03/2011 -260 9 6 111B 01/08/2011 2 2 7 111B 12/09/2012 500 502 8 111B 13/09/2012 -166 336 9 111B 13/09/2012 -225 111

【问题讨论】:

  • 什么版本的 SQL Server?
  • 这是 2008 R2。感谢 2012 解决方案。如果我们迁移到 2012 年,请记住这一点

标签: sql-server


【解决方案1】:

如果您使用的是 SQL Server 2012,这是一个非常简单的查询:

declare @t table (P_ID int,AcctNo char(4), [Date] date, Amount int)
insert into @t(P_ID,AcctNo,Date,Amount) values
(1,'111A','20110304',-331),
(2,'111A','20110304',600),
(3,'111A','20110304',20000),
(4,'111A','20110305',-20000),
(5,'111A','20110310',-260),
(6,'111B','20110801',2),
(7,'111B','20120912',500),
(8,'111B','20120913',-166),
(9,'111B','20120913',-225)

select *,SUM(Amount) OVER (PARTITION BY AcctNo ORDER BY P_ID
      RANGE UNBOUNDED PRECEDING) from @t order by P_ID

结果:

P_ID        AcctNo Date       Amount      
----------- ------ ---------- ----------- -----------
1           111A   2011-03-04 -331        -331
2           111A   2011-03-04 600         269
3           111A   2011-03-04 20000       20269
4           111A   2011-03-05 -20000      269
5           111A   2011-03-10 -260        9
6           111B   2011-08-01 2           2
7           111B   2012-09-12 500         502
8           111B   2012-09-13 -166        336
9           111B   2012-09-13 -225        111

这使用了 SQL Server 2012 中的新功能,以便在范围内应用聚合函数 - 事实上,在这种情况下甚至不需要 RANGE 子句,因为:

如果没有指定ROWS/RANGE,但指定了ORDER BY,则默认使用RANGE UNBOUNDED PRECEDING AND CURRENT ROW作为窗口框架

但我在这里添加它是为了让发生的事情更清楚。

【讨论】:

    【解决方案2】:

    试试这个:-

    SELECT P_ID,AcctNo, Amount,
    (SELECT SUM(Amount)  as total
        FROM YourTable s 
        WHERE s.P_ID <= a.P_ID and s.AcctNo=a.AcctNo   
     ) AS b
    FROM YourTable a
    

    SQLFIDDLE中的演示

    结果

    ╔══════╦════════╦════════╦═══════╗
    ║ P_ID ║ ACCTNO ║ AMOUNT ║   B   ║
    ╠══════╬════════╬════════╬═══════╣
    ║    1 ║ 111A   ║   -331 ║  -331 ║
    ║    2 ║ 111A   ║    600 ║   269 ║
    ║    3 ║ 111A   ║  20000 ║ 20269 ║
    ║    4 ║ 111A   ║ -20000 ║   269 ║
    ║    5 ║ 111A   ║   -260 ║     9 ║
    ║    6 ║ 111B   ║      2 ║     2 ║
    ║    7 ║ 111B   ║    500 ║   502 ║
    ║    8 ║ 111B   ║   -166 ║   336 ║
    ║    9 ║ 111B   ║   -225 ║   111 ║
    ╚══════╩════════╩════════╩═══════╝
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-19
      • 2018-04-21
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      相关资源
      最近更新 更多