用合并列计算一个正在运行的加-减总数

9avjhtql  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(281)

我有一张表,有五栏说明,期初余额,销售,销售退回,往来款。
我想合并期初余额,销售作为“借方”和销售退回,收款作为“贷方”。
余额栏中借方发生额加贷方发生额减的“余额”列名称如何计算流水合计?

我的尝试是
选择描述(invoiceamount+openingbalance)作为“dabit”,(dramount+salereturn+baddebAmount)作为“credit”,sum(sale+openingbalance salereturn recipt)over(order by id)作为表名中的runningagetotal

ogq8wdun

ogq8wdun1#

你好像在描述 coalesce() 和一个窗口函数:

select description,
       coalesce(opening, sale) as debit,
       coalesce(return, receipt) as credit,
       sum(coalesce(opening, sale, 0) - coalesce(return, receipt,  0)) over (order by order by (case description when 'opening balance' then 1 when 'sale' then 2 when 'sale return' then 3 else 4 end))
from t
order by (case description when 'opening balance' then 1 when 'sale' then 2 when 'sale return' then 3 else 4 end);
jvidinwx

jvidinwx2#

以创建临时列表为代价,linq版本如下:
假设您的原始数据源来自sql数据库,那么您首先需要将数据放入内存,例如

var records = OrderDetails
    .OrderBy(a=>a.Date)
    .Select(a => new 
    {
        a.Description,
        Debit = a.OpeningBalance + a.Sale,
        Credit = a.Return + a.SaleReturn
    }
    )
    .ToList();

注意需要对查询进行排序,以确保以正确的顺序返回日期。您没有提到任何其他字段,所以我假设有一个名为date的字段可以使用。
一旦内存中有了数据,就可以添加balance列,即

decimal balance = 0;
var list = records.Select(a => new
{
    a.Description,
    a.Debit,
    a.Credit,
    Balance =  balance +=  (a.Debit - a.Credit),
}).ToList();

因为您要引入一个局部变量并在linq语句外部对其进行初始化,所以除非余额被重置为零,否则查询不能被枚举两次。你可以通过使用 .ToList(); 或者 .ToArray();

相关问题