-1

我想获得计算的 SUM 值的平均值,但我收到一条错误消息,指出我“无法对包含聚合或子查询的表达式执行聚合函数”。

示例代码:

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

我想返回 Parts 和 Labor 的平均值,但是当我尝试将 AVG 函数包裹在它们周围时,我得到了前面描述的错误。

我应该如何正确返回所需的平均值?

4

2 回答 2

0

如果您只想要平均值而不是总和,只需替换SUMAVG

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
于 2013-03-27T14:19:05.643 回答
0

严格来说,要么为 NULL,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 Parts 和 Labor 值视为 0,请使用:

select t.ReferenceNo, t.Parts, t.Labor,
       (coalesce(Parts, 0) + coalesce(Labor, 0)) / 2
. . .
于 2013-03-27T14:37:11.340 回答