Mysql 在某些条件下计算并交换某些列中的结果

Mysql 在某些条件下计算并交换某些列中的结果,mysql,sql,ssms,Mysql,Sql,Ssms,这些极客, 我有一张像这样的桌子 P_date P_Supplier P_parti P_opnbal P_Credit P_Debit P_Remaining NULL varsha opening 2000 0 0 2000 2014-01-25 varsha purchase 0 500 0 500 NULL

这些极客, 我有一张像这样的桌子

 P_date     P_Supplier  P_parti   P_opnbal  P_Credit     P_Debit P_Remaining 
 NULL         varsha    opening    2000        0            0       2000
 2014-01-25  varsha     purchase    0          500          0        500
 NULL        nipun      opening    1000        0            0       1000
 2015-01-28  nipun      purchase    0          200          0        200
 2016-01-25  varsha     purchase    0          350          0        350 
现在,我启动这个查询来获取sum或all列

SELECT P_sname, SUM(P_opnbal) AS opneningbal, SUM(P_credit) AS credit, SUM(P_debit) AS debit, SUM(P_opnbal) + SUM(P_credit) - SUM(P_debit) AS closingbal
FROM ACNT
GROUP BY P_sname
ORDER BY P_sname DESC
所以我得到了这个结果

P_Supplier  P_opnbal    P_Credit    P_Debit CLossing
varsha      2000        850          0       2850
nipun       1000        200          0       1200
但是现在我想在特定的日期范围内计算这些列。 例如。 如果我想要2015-01-28和2016-01-28之间的数据。 那么,2014-01-28日期表中的所有数据应显示为期初余额,如果给定日期范围内没有条目,则贷方应为0

见表1,该行的日期为2014年1月28日,其p_信用值应加上其p_opnbal值i.i 2000。因此,应显示2500作为期初余额。 期望的结果应该是这样的

Supplier   Opnbal   credit  Debit   closing balance
varsha     2500     350     0        2850
nipun      1000     200     0        1200
我知道我需要不止一个查询,我在学习阶段,这就是我尝试的

SELECT P_sname, opneningbal + credit AS openingbal, credit, debit, closingbal
FROM 
(SELECT TOP (100) PERCENT P_sname, SUM(P_opnbal) AS opneningbal, SUM(P_credit) AS credit, SUM(P_debit) AS debit, SUM(P_opnbal) + SUM(P_credit)- SUM(P_debit) AS closingbal
 FROM ACNT
WHERE (P_date BETWEEN '2015-01-25' AND '2016-01-25')
GROUP BY P_sname
ORDER BY P_sname DESC) AS abc
但是我没有得到想要的结果,请帮助我改进这个查询。谢谢

根据我们在中的聊天

我发现你的最后一个问题应该是

SELECT P_sname, (isnull((select sum(isnull(ac.P_credit,0)) from ACNT as ac where ac.P_sname=abc.P_sname and P_date<'2015-01-25'),0) 
+(select top(1) isnull(nt.p_opnbal,0) from acnt as nt where nt.p_sname=abc.P_sname and p_parti='Opening')) as opening_bal, credit, debit, ((isnull((select sum(isnull(ac.P_credit,0)) from ACNT as ac where ac.P_sname=abc.P_sname and P_date<'2015-01-25'),0) 
+(select top(1) isnull(nt.p_opnbal,0) from acnt as nt where nt.p_sname=abc.P_sname and p_parti='Opening'))+(credit-debit)) as closingBal 
FROM (SELECT TOP (100) PERCENT P_sname, SUM(P_opnbal) AS opneningbal, SUM(P_credit) AS credit, SUM(P_debit) AS debit, SUM(P_opnbal) + SUM(P_credit) 
- SUM(P_debit) AS closingbal, P_date 
FROM ACNT 
GROUP BY P_sname, P_date 
ORDER BY P_sname DESC) AS abc 
WHERE (P_date BETWEEN '2015-01-25' AND '2016-01-25')
提示:还有更多的改进余地scaler函数可以最小化您的查询,您也可以通过一个select查询来实现这一点

谢谢