2013-06-26 79 views
0

我寫了下面的視圖在SQL減借方和貸方列

SELECT  TOP (100) PERCENT Accounting.TopicA.CodeA, SUM(Accounting.DocumentDetail.Debit) AS DEB, SUM(Accounting.DocumentDetail.Credit) AS CRED, 
         Accounting.TopicA.Description 
FROM   Accounting.TopicA INNER JOIN 
         Accounting.DocumentDetail ON Accounting.TopicA.CodeA = SUBSTRING(Accounting.DocumentDetail.Topic, 1, 2) 
GROUP BY Accounting.TopicA.CodeA, Accounting.TopicA.Description 
ORDER BY Accounting.TopicA.CodeA 

,其結果是

codea |Description | DEB | CRED | 
1  Bank  | 100 | 30 | 
2  Cash  | 40 | 70 | 
. 
. 
. 

現在我需要增加兩個欄減去DEB和CRED一樣,當減法正面然後把結果放在POS列否則NEG列如下

codea |Description | DEB | CRED | NEG | POS | 
1  Bank  | 100 | 30 | 70 | 0 | 
2  Cash  | 40 | 70 | 0 | 30 | 
. 
. 
. 
+0

你得到什麼錯誤你有什麼嘗試? –

+0

我可以做出第一個結果,但我需要做第二個結果,第一個現在正在工作,但不知道第二個@AdrianThompsonPhillips –

+0

請注意'TOP(100)PERCENT' - 'ORDER BY'構造是完全的無用。當您從視圖中選擇時,它不起作用。 –

回答

3

嘗試這樣:

SELECT TOP (100) PERCENT Accounting.TopicA.CodeA, 
SUM(Accounting.DocumentDetail.Debit) AS DEB, 
SUM(Accounting.DocumentDetail.Credit) AS CRED, 
CASE WHEN SUM(Accounting.DocumentDetail.Credit) - SUM(Accounting.DocumentDetail.Debit) < 0 
THEN SUM(Accounting.DocumentDetail.Debit) - SUM(Accounting.DocumentDetail.Credit) 
ELSE 0 END AS NEG, 
CASE WHEN SUM(Accounting.DocumentDetail.Credit) - SUM(Accounting.DocumentDetail.Debit) > 0 
THEN SUM(Accounting.DocumentDetail.Credit) - SUM(Accounting.DocumentDetail.Debit) 
ELSE 0 AS POS, 
Accounting.TopicA.Description 
FROM Accounting.TopicA 
INNER JOIN Accounting.DocumentDetail 
ON Accounting.TopicA.CodeA = SUBSTRING(Accounting.DocumentDetail.Topic, 1, 2) 
GROUP BY Accounting.TopicA.CodeA, Accounting.TopicA.Description 
ORDER BY Accounting.TopicA.CodeA 
+0

是的,正是我的想法。做得好! –

+0

問題:每次執行SUM(Accounting.DocumentDetail.Credit)時,都會計算列的總和嗎?還是計算一次值,並且每次使用該值時sql引擎都會重新使用結果? –

+0

@ScottChamberlain這將取決於數據庫引擎,但如果重新計算它,我會非常驚訝。它通常足夠聰明,可以做類似的事情。也就是說,有[其他解決方案](http://stackoverflow.com/a/17325665/1159478)可以避免重複代碼清晰度比任何其他更多。 – Servy

0

我有想法使用CASE語句做這個。

下面是SQL Server的CASE文檔的鏈接:http://msdn.microsoft.com/en-us/library/ms181765.aspx
我只是猜測你使用SQL Server作爲問題打上C#,儘管它應該與MySQL和甲骨文,兼容......太。

這個想法是使用這個CASE知道什麼時候將0放在NEG或POS列中,以及在哪裏放置實際結果。

注意:您是否真的必須擁有NEG和POS列?你不是隻想創建一個「結果」列嗎?

0

爲陰柱,你可以使用:

ABS(Min(0, theSubtraction)) 

爲陽柱,你可以使用:

Max(0, theSubtraction)