2017-05-03 44 views
0

時,這是我的查詢:集合函數sum沒有工作確定子查詢

SELECT 
    Sum(IsNull(CircuitCourtFeeCap, 0) + IsNull(CircuitCourtCourtTime, 0) + IsNull(CircuitCourtWaiverFee, 0) + IsNull(CircuitCourtExpenseFee, 0)) AS TotalApproved, 
    Sum(IsNull(e.FeeAmountCap, 0)) AS TotalFeeCap, 
    Sum(IsNull((
       SELECT Claimed 
       FROM [dbo].[CourtTimes] ct 
       WHERE ct.DocumentNameID = dn.DocumentNameID 
       ), 0)) AS TotalCourtTime 
FROM DocumentNames dn 
LEFT JOIN Expenses e ON dn.DocumentNameID = e.DocumentNameID 

這是超級簡單。除了這片線的各種形式的金額不工作:

Sum(IsNull((Select Claimed From [dbo].[CourtTimes] ct Where ct.DocumentNameID = dn.DocumentNameID), 0)) As TotalCourtTime 

我得到這個錯誤:Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

任何想法如何解決這個問題呢?

+0

你幾乎擁有它。在SELECT之後移動SUM並將括號括起來。這裏有一個很好的例子:https://www.essentialsql.com/get-ready-to-learn-sql-server-20-using-subqueries-in-the-select-statement/ –

+0

@ Nick.McDermaid:那不會幫幫我。這裏是我得到的錯誤,如果我嘗試這樣做:*列'DocumentNames.DocumentNameID'在選擇列表中是無效的,因爲它不包含在聚合函數或GROUP BY子句。* –

回答

1

就像錯誤說的那樣,你不能執行一個聚合函數(sum()在本例子查詢中)。相反,加入其他表中您FROM條款:

SELECT 
    Sum(IsNull(CircuitCourtFeeCap, 0) + IsNull(CircuitCourtCourtTime, 0) + IsNull(CircuitCourtWaiverFee, 0) + IsNull(CircuitCourtExpenseFee, 0)) AS TotalApproved, 
    Sum(IsNull(e.FeeAmountCap, 0)) AS TotalFeeCap, 
    Sum(IsNull(ct.CourtTime, 0)) AS TotalCourtTime 
FROM DocumentNames dn 
    LEFT OUTER JOIN (SELECT DocumentNameID, sum(claimed) as CourtTime FROM [dbo].[CourtTimes] GROUP BY DocumentNameID) ct 
     ON ct.DocumentNameID = dn.DocumentNameID 
    LEFT OUTER JOIN Expenses e 
     ON dn.DocumentNameID = e.DocumentNameID; 

更新這個答案移動[CourtTimes]表連接成一個子查詢,以便它可以在DocumentNameID級預聚合加入之前。

+0

好吧,聽起來很合理,但我有疑問。如果我加入,它不會產生問題。例如CourtTimes包含每個DocumentNames條目的5個條目。 CircuitCourtFeeCap的總和是不會被重複計算的呢?或者每個DocumentName條目只計算一次? –

+0

它可能很好。如果您遇到1:多的連接會導致記錄數增加的問題,請查看上面的第一條註釋。將SUM()移入子查詢將解決該問題,而不切換到JOIN。我將更新答案以顯示如何在FROM子句中的子查詢中執行此操作。 – JNevill

+0

尼克的答案沒有工作,但你的更新答案看起來很有希望,並可能給我我需要的結果。超級男人!你讓我今天一整天都感覺很好 –