2013-03-27 61 views
-1

我想獲取計算的SUM值的平均值,但出現錯誤,指出我無法對包含聚合或子查詢的表達式執行聚合函數。對計算出的SUM值執行AVG

示例代碼:

SELECT 
T.ReferenceNo, 
Parts = ROUND(SUM(
    CASE 
     WHEN T.AccountCode in ('value1', 'value2') THEN 
      T.Amount 
    END),2) 
Labor = ROUND(SUM(
    CASE 
     WHEN T.AccountCode in ('value1', 'value2') THEN 
      T.Amount 
    END),2) 
FROM Transactions T 

我想回到平均的零部件和人力資源,但是當我試圖將其佈置在AVG功能我得到的錯誤如前所述。

我應該如何正確返回所需的平均值?

+0

不知道你是問。 SUM()的AVG()將始終爲SUM(),因此需要多個值來計算平均值。你能提供一些細節嗎? – Sparky 2013-03-27 14:08:23

回答

0

如果你只想平均,而不是總和,只需用AVG替換SUM

SELECT 
T.ReferenceNo, 
Parts = ROUND(AVG(
    CASE 
     WHEN T.AccountCode in ('value1', 'value2') THEN 
      T.Amount 
    END),2) 
Labor = ROUND(AVG(
    CASE 
     WHEN T.AccountCode in ('value1', 'value2') THEN 
      T.Amount 
    END),2) 
FROM Transactions T 

如果你想兩個值(兩列)的平均值,那麼你可以使用:

(VALUE1 + VALUE2)/2 
0

嚴格來說,要麼是Parts要麼是Labor可能是NULL,這會混淆簡單的平均計算。我建議:

select t.ReferenceNo, t.Parts, t.Labor, 
     (case when Parts is null then Labor 
      when Labor is null then Parts 
      else (Parts + Labor)/2 
     end) as AvgPartsLabor 
from (SELECT T.ReferenceNo, 
      Parts = ROUND(SUM(CASE WHEN T.AccountCode in ('value1', 'value2') 
            THEN T.Amount 
           END),2) 
      Labor = ROUND(SUM(CASE WHEN T.AccountCode in ('value1', 'value2') 
            THEN T.Amount 
           END),2) 
     FROM Transactions T 
     group by t.referenceNo 
    ) t 

如果你想明確地將NULL零部件和勞動價值爲0,然後使用:

select t.ReferenceNo, t.Parts, t.Labor, 
     (coalesce(Parts, 0) + coalesce(Labor, 0))/2 
. . .