2016-06-19 57 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 –