2017-10-19 135 views
0

嗨我有這個查詢,我可以讓我的客戶餘額作爲以後的報告使用。但我有點卡在2列應該計算的部分,並將結果查看到另一列,更難的部分是他們在不同的行上。因此,這裏是我的查詢SQL - 計算2列和查看結果到另一列

SELECT ROW_NUMBER() OVER(ORDER BY DR.id)     AS 'NO.' ,   
     CONVERT(VARCHAR(13), CAST(DR.doc_date AS DATE), 100) AS 'DOC DATE', 
     v.which AS 'DOC TYPE', 
     CASE WHEN 
      v.which IN ('NET TOTAL', 'DELL/COL/CHARGE') THEN V.val 
      END AS DEBIT, 
     CASE WHEN 
      v.which IN ('CDW', 'PAYMENT') THEN V.val 
      END AS CREDIT, 
     CAST(v.val AS float) + CAST(v.val AS float) AS 'BALANCE' 

FROM [dbo].[doc_customer] DC 
LEFT JOIN [dbo].[doc_rent] DR ON DR.doc_sourced_customer_id = DC.id 
LEFT JOIN [dbo].[slip_rent] SR ON SR.doc_sourced_doc_rent_id = DR.id 
LEFT JOIN [dbo].[slip_rent_payment] SP ON SP.doc_sourced_rent_id = DR.id OUTER APPLY 
    (VALUES ('NET TOTAL', SR.net_total), 
      ('DELL/COL/CHARGE', SR.dell_col_charge), 
      ('CDW', SR.CDW), 
      ('PAYMENT', sp.amount) 
    ) v(which, val) 
WHERE DC.id = '1-1---1-1-1---1--1~1' 
AND DR.deleted = 0 
AND DR.void = 0 
AND v.val IS NOT NULL 
AND v.val <> '' ; 

如u可以在我的查詢看到我能得到借記卡和信用卡的價值,但我的問題是 如何得到他們的總計算。


我所需的輸出

| NO. | DOC DATE | DOC TYPE | DEBIT | CREDIT | BALANCE 
------------------------------------------------------------- 
1 | 1 | Mar 28 2017 | NET TOTAL | 341 | NULL | 
2 | 2 | Mar 28 2017 | PAYMENT | NULL | 4000 | -3659 
3 | 3 | Oct 16 2017 | NET TOTAL | 150 | NULL | -3509 
4 | 4 | Oct 16 2017 | CDW  | NULL | 50  | -3559 
5 | 5 | Oct 16 2017 | PAYMENT | NULL | 150 | -3709 

這裏的鏈接,我的期望輸出sql desired output

+0

我將所需的輸出添加爲格式化文本以及並非每個人都可以打開圖像,並且並非所有設備都能在其小屏幕上清晰地讀取圖像。雖然這是指代碼,但它也非常適用於當前和預期輸出等重要信息►[**爲什麼在提問時**不會上傳代碼圖像**](https://meta.stackoverflow.com/問題/ 285551 /爲什麼不上傳圖像的代碼 - 這樣當提問/ 285557#285557) – Nope

+0

謝謝。我不知道stackoverflow可以這樣做。 –

回答

0

,如果這是SQL Server 2012中或更高版本,你要ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW這樣的(注意,你需要一個索引,所以我選擇了[編號]:

SELECT [NO.], Debit, Credit, 
    SUM(coalesce(Debit,0) - coalesce(Credit,0)) OVER(ORDER BY [NO.] 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
      AS BALANCE 
FROM 
(
SELECT ROW_NUMBER() OVER(ORDER BY DR.id)     AS 'NO.' ,   
     CONVERT(VARCHAR(13), CAST(DR.doc_date AS DATE), 100) AS 'DOC DATE', 
     v.which AS 'DOC TYPE', 
     CASE WHEN 
      v.which IN ('NET TOTAL', 'DELL/COL/CHARGE') THEN V.val 
      END AS DEBIT, 
     CASE WHEN 
      v.which IN ('CDW', 'PAYMENT') THEN V.val 
      END AS CREDIT, 
     CAST(v.val AS float) + CAST(v.val AS float) AS 'BALANCE' 

FROM [dbo].[doc_customer] DC 
LEFT JOIN [dbo].[doc_rent] DR ON DR.doc_sourced_customer_id = DC.id 
LEFT JOIN [dbo].[slip_rent] SR ON SR.doc_sourced_doc_rent_id = DR.id 
LEFT JOIN [dbo].[slip_rent_payment] SP ON SP.doc_sourced_rent_id = DR.id OUTER APPLY 
    (VALUES ('NET TOTAL', SR.net_total), 
      ('DELL/COL/CHARGE', SR.dell_col_charge), 
      ('CDW', SR.CDW), 
      ('PAYMENT', sp.amount) 
    ) v(which, val) 
WHERE DC.id = '1-1---1-1-1---1--1~1' 
AND DR.deleted = 0 
AND DR.void = 0 
AND v.val IS NOT NULL 
AND v.val <> '' 
) a 
+0

它的作品很神奇!很有幫助。謝謝 ! –