2015-12-22 47 views
1

其餘的我已經盡力簡化這個有點不刪除任何相關信息,所以這裏去排除行...如何從彙總基礎上,中行的總

我試圖重寫這是一個目前彙總數據的視圖,但是基於某些數據的彙總,它可能包含或可能不包含其他數據。例如:

;WITH CTE_ExtraFees AS 
(
    SELECT AccountID, SUM(Amount) AS TotalAmount 
    FROM AccountFees 
    WHERE 
     FeeType = 'EXTRA' AND 
     AccountType = 'P' 
    GROUP BY 
     AccountID 
) 
SELECT 
    AccountID, 
    CASE 
     WHEN SUM(F.Amount) > 0 THEN SUM(F.Amount) - XF.TotalAmount 
     ELSE SUM(F.Amount) 
    END AS FeeAmount 
FROM 
    AccountFees F 
LEFT OUTER JOIN CTE_ExtraFees XF ON XF.AccountID = F.AccountID 
GROUP BY 
    F.AccountID, 
    XF.TotalAmount 

有上額外的費用被排除相當多一點的邏輯,但我所有的制定出和上面是我的最後一個關鍵點。我現在有一些與此類似:

SELECT 
    AccountID, 
    SUM(Amount) AS FeeAmount 
FROM 
    AccountFees 
WHERE 
    (
     FeeType <> 'EXTRA' OR 
     AccountType <> 'P' 
    ) 
GROUP BY 
    AccountID 

當然,問題是,當我SUM(Fees) <= 0最終仍不包括額外的費用。

我想,以避免由於性能原因進行多次聚集,所以我希望做這一切在一個聚集,但我似乎無法拿出什麼來完成相同的邏輯。

感謝任何幫助或建議,你可以給!

+0

這是什麼棘手句話是什麼意思'但基於一些數據的彙總它可能會或可能不會包括其他data'?沒有樣本數據我無法得到你。 –

回答

2
SELECT 
     AccountID 
    , FeeAmount = 
     CASE WHEN SUM(Amount) > 0 
      THEN SUM(Amount) - SUM(CASE WHEN FeeType = 'EXTRA' AND AccountType = 'P' THEN Amount ELSE 0 END) 
      ELSE SUM(Amount) 
     END 
FROM dbo.AccountFees 
GROUP BY AccountID 
+0

謝謝!爲我正在努力的那部分工作。我的標準還包括一個EXIST(我爲了簡單起見),我不能把它放在SUM(CASE ...)中,因爲SQL Server不會接受這個。不過這是一個單獨的問題,所以我可能會爲此提出一個新問題。 –

+0

不用客氣;) – Devart

2

我如何

SELECT 
    AccountID, 
    SUM(
     CASE WHEN FeeType = 'EXTRA' AND AccountType = 'P' 
      THEN -1 * Amount 
      ELSE Amount 
     END 
    ) AS FeeAmount 
FROM AccountFees 
GROUP BY AccountID 

認爲他們關鍵部分,你可能已經丟失對這個問題是,你可以運行在一個case語句,這既是中使用的求和函數的事實我的回答和Devart的回答(順便說一句,我覺得它更全面地包含了原始查詢的邏輯)。 case語句將逐行觸發,然後將結果提供給sum函數,從而產生條件求和函數。

+0

謝謝。我曾想過使用SUM(CASE ...),但沒有考慮將它們嵌入Devart的方式。關鍵是CASE SUM()SUM(CASE ...) –