【问题标题】:sql running total for an account balance账户余额的sql运行总计
【发布时间】:2015-05-22 12:05:08
【问题描述】:

我正在尝试在 SQL2008 中准备明细账视图报表。 这是临时表

AccountCode |Date       |Fiche Type      |Debit    |Credit  |Balance
100.001.001 |1.1.2015   |Açılış Fişi     |1856,09  |0       |1856,09
100.001.002 |1.1.2015   |Mahsup Fişi     |0        |20      |-20
100.001.001 |1.2.2015   |Tediye Fişi     |0        |950     |906,09
100.001.002 |1.2.2015   |Açılış Fişi     |2931,37  |0       |2911,37
100.001.001 |1.4.2015   |Mahsup Fişi     |0        |6,25    |899,84
100.001.002 |1.6.2015   |Tahsil Fişi     |0        |400     |2511,37
100.002.001 |1.7.2015   |Açılış Fişi     |0        |1969,5  |-1969,5
100.002.001 |1.20.2015  |Mahsup Fişi     |217,6    |0       |-1751,9
100.001.001 |1.21.2015  |Mahsup Fişi     |500      |0       |1399,84
100.002.001 |1.21.2015  |Tediye Fişi     |2000     |0       |248,1
100.001.002 |1.21.2015  |Tahsil Fişi     |543,34   |0       |3054,7

在最后一列中,我试图计算第一列中帐户代码的余额。余额字段的公式很简单(借方-贷方)。报告应按日期排序。因此,例如在第 3 行中,由于帐户代码相同,因此余额字段必须采用第一列的值并将它们与第 3 列的值结合起来(Row1(Debit-Credit)+Row3(​​Debit-Credit))。

我尝试了很多东西,但没有运气,因为列表不是按照运行总数所依据的标准排序的。

谁能给我一个解决方案?

【问题讨论】:

  • 你能显示你的查询吗?
  • 我尝试了很多,这是其中之一:SELECT tmu.Accountcode, tmu.date, tmu.[Fiche Type], tmu.debit, tmu.credit, ( SELECT SUM(balance) from tempMuavin mua WHERE convert(char(10),tmu.Tarih,101)=convert(char(10),mua.tarih,101)) FROM tempMuavin tmu ORDER BY date 它产生了一个包含一些奇怪值的列,例如:4,36557456851006E-11 -5,18980414199177E-11 -7,82165443524718E-11 -

标签: sql sql-server-2008 cumulative-sum


【解决方案1】:
    with x as 
    (
      select *,row_number() over (partition by accountcode order by date) sr 
      from ledger

    )
    select 
      (select sum(debit-credit) from x y where y.accountcode=x.accountcode and y.sr<x.sr) opening
      ,*
      ,(select sum(debit-credit) from x y where y.accountcode=x.accountcode and y.sr<=x.sr) closing
    from x

参见 SQL Fiddle here

HTH

【讨论】:

  • 这在下面产生了 3 个额外的列; |开始 |结束 |SrNo |NULL |-9,09640220925212E-08 |1
【解决方案2】:

在 SQL Server 2012+ 中,您可以为此使用累积和。在 SQL Server 2008 中,您可以使用关联子查询、联接或应用。这是后者:

select l.*, cume.balance
from ledger l cross apply
     (select sum(debit - credit) as balance
      from ledger l2
      where l2.AccountCode = l.AccountCode and
            l2.date <= l.date
     ) cume;

【讨论】:

  • 我试过了,它给了我具体账户的总和。
  • @OrkunAntmen 。 . .起初,我不知道那是怎么回事。但是,where 条件是l2.date &lt;= date 而不是l2.date &lt;= l.date(现已修复)。第一个版本是重言式,解释为l2.date &lt;= l2.date,因为范围规则。始终限定列。
  • 我想你快到了,戈登。我得到了下表:link 我想我可以尝试从 fiche 行表中添加一个logicalref(主键)条件,因为它会自动添加当天的总数,这对于查询来说非常合乎逻辑。非常感谢。
  • 或者最好按照 Mitan 的建议在临时表中添加一个主键列,并将该列包含在您的 Where 子句中。
猜你喜欢
  • 2016-07-18
  • 2016-09-23
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
相关资源
最近更新 更多