2017-10-19 15 views
0

こんにちは私はこの顧客の残高を後で報告するために使用することができます。しかし、2つの列を計算し、結果を別の列に表示する必要があるこの部分ではちょっと固まっています。困難な部分は別の行にあります。だからここにuは私は借方と貸方値を得ることができ、私のクエリで見ることができるように私のクエリ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 <> '' ; 

だが、私の問題は、その計算の合計を取得する方法について です。


マイ所望の出力

| 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

私はフォーマットされたテキストとして望ましい出力を追加しました誰もが画像を開くことはできませんし、すべての機器が小さな画面ではっきりと画像を読み取るわけではありません。これはコードを参照していますが、現在の出力や予想される出力のような重要な情報にも非常に当てはまります。[**]質問をするときにSOのコードイメージをアップロードしないのはなぜですか?**](https://meta.stackoverflow.com/質問/ 285551 /なぜ画像をアップロードしないのか - 質問時にコードの/ 285557#285557) – Nope

+0

ありがとうございます。私はstackoverflowがそうすることができるか分からなかった。 –

答えて

0

ためのリンクです、これはSQL Server 2012の以上であれば、あなたはこのようにROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWをしたい(あなたがインデクサーを必要と気づきます、私は[No.]を選択しました:

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

それは魔法のように機能します!非常に役立ちます。ありがとう! –

関連する問題