在选定的账单

时间:2017-07-27 13:42:10

标签: sql-server

实际上我正在我的项目中创建一个收据表格,现在我已经清除了日期明智的账单,但现在我还有一个疑问。如果我在该范围内的1/6/17 - 15/6/17选择user1账单,金额的总和将显示为10,000卢比。现在user1支付5000现在如何在第二次付款时在user1显示余额金额。

[注意:User1已于1月6日17日至2017年3月17日购买。 ]

select 
    sum(TotalValue)  bal 
from(
    select 
        ISNULL(sum(s.NetAmount),0) TotalValue 
    from Sales as s 
    where s.ConsumerID=56 
    and s.SaleDate='2017/06/10' 
    and s.SaleDate='2017/06/30' 

    union all

   select - ISNULL(sum(s.Amount),0) TotalValue 
   from Receipt  as s 
   where s.ConsumerID=56
) n

我的查询没有给出确切的输出。

如何在此代码中重写以获取输出。

提前致谢..,

在我的销售表记录中,2017年6月1日至2017年6月30日期间列(netamount)值的总和为36000。

现在我输入第一张收据。所以我首先检查我的用户账单金额,写这个嵌套查询,当我的用户选择以3个会费支付前10天的金额。

例如1/6/17 - 10/6/17总金额为15000.在第一次收据中,用户支付了5000.

在第二个条目中,我获得金额的值是10000但查询返回31000

1 个答案:

答案 0 :(得分:0)

您可以尝试下面的SQL

     ;WITH cte_sales 
     AS (SELECT s.consumerid 
                ,Isnull(Sum(s.netamount), 0) TotalSalesValue 
         FROM   sales AS s 
         WHERE  s.consumerid = 56 
                AND s.saledate >= '2017/06/10' 
                AND s.saledate <= '2017/06/30' 
         GROUP  BY s.consumerid), 
     cte_recipt 
     AS (SELECT r.consumerid 
                ,Isnull(Sum(r.amount), 0) TotalReceiptValue 
         FROM   receipt AS r 
         WHERE  r.consumerid = 56 
         GROUP  BY r.consumerid) 
SELECT a.consumerid 
       ,a.totalsalesvalue - Isnull(totalreceiptvalue, 0) balance 
FROM   cte_sales a 
       LEFT JOIN cte_recipt b 
              ON a.consumerid = b.consumerid 
GROUP  BY a.consumerid 

另一种解决方案是

SELECT s.consumerid ,Isnull(Sum(s.netamount), 0)  -  Isnull(Sum(r.amount), 0) as balance
 FROM   sales AS s 
 left join  receipt AS r 
 on s.consumerid = r.consumerid

         WHERE  s.consumerid = 56 
                AND s.saledate >= '2017/06/10' 
                AND s.saledate <= '2017/06/30' 

您需要确定哪个具有更好的SQL执行计划