2016-06-19 26 views
0

我使用SqlExpress如何添加累计和列?

以下是查询使用我得到附加的结果。

SELECT ReceiptId, Date, Amount, Fine, [Transaction] 
FROM (
    SELECT ReceiptId, Date, Amount, 'DR' AS [Transaction] 
    FROM ReceiptCRDR 
    WHERE  (Amount > 0) 

    UNION ALL 

    SELECT  ReceiptId, Date, Amount, 'CR' AS [Transaction] 
    FROM   ReceiptCR 
    WHERE  (Amount > 0) 

    UNION ALL 

    SELECT  strInvoiceNo AS ReceiptId, CONVERT(datetime, dtInvoiceDt, 103) AS Date, floatTotal AS Amount, 'DR' AS [Transaction] 
    FROM   tblSellDetails 
) AS t 
ORDER BY Date 

结果

enter image description here

想要一个新的列这将显示出余额。例如, 。 1排应该显示-2500,第2应该是-3900,第3应该是-700等等。

基本上,它需要上一行'帐户列的数据并根据交易类型进行计算。

示例结果

enter image description here

+2

请编辑您的问题以包含相关的rdbms。一些示例数据也会很好。 –

+0

不应该第四行所需的输出返回-1700,然后-1200和-500?还有没有真正的订单机制,例如交易的日期和时间? – Parfait

+0

你是对的。第四行应该是1700.排序是基于日期。如果您查看我的查询,则会根据日期进行排序。 –

回答

1

嗯,看起来像SQL-Server,如果你使用的是2012+,然后使用SUM() OVER()

SELECT t.*, 
     SUM(CASE WHEN t.transactionType = 'DR' 
       THEN t.amount*-1 
       ELSE t.amount END) 
      OVER(PARTITION BY t.date ORDER BY t.receiptId,t.TransactionType DESC) as Cumulative_Col 
FROM (YourQuery Here) t 

这将SUM值时,其CRvalue*-1当其DR

现在我按日期分组,这意味着每天将重新计算此列,如果你想为所有的时间,更换OVER()这个:

OVER(ORDER BY t.date,t.receiptId,t.TransactionType DESC) as Cumulative_Col 

另外,我不明白为什么在同一天,对于相同的ReceiptIdDR之前计算CR,我已经将它添加到顺序,但如果这不是你想要的然后更好地解释逻辑。

+0

这是因为如果客户已经支付了部分款项,那么余额将被保存为DR和支付金额为CR –

+2

我明白了,但是为什么您首先计算扣除'DR'然后添加'CR'?为什么不相反呢?按哪一列排序? 。无论如何,这应该工作。 @MARKANDBhatt – sagi

+0

我收到错误:“不正确的语法附近的命令”我使用SQLExpress。可能是SqlExpress 2008 –