对计算的 SUM 值执行 AVG

Posted

技术标签:

【中文标题】对计算的 SUM 值执行 AVG【英文标题】:Performing an AVG on a calculated SUM value 【发布时间】:2013-03-17 15:38:58 【问题描述】:

我想获取计算的 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 函数包裹在它们周围时,我得到了前面描述的错误。

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

【问题讨论】:

不确定你在问什么。 SUM() 的 AVG() 将始终是 SUM(),您需要多个值来计算平均值。你能提供更多细节吗 【参考方案1】:

如果您只想要平均值而不是总和,只需将 SUM 替换为 AVG

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

【讨论】:

【参考方案2】:

严格来说,PartsLabor 都可能为 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
. . .

【讨论】:

以上是关于对计算的 SUM 值执行 AVG的主要内容,如果未能解决你的问题,请参考以下文章

枢轴计算公式:SUM(Field1)/AVG(Field2)

spark将列值作为sql查询执行

统计函数

在oracle中按要求统计行数,怎么运用sum和count函数?

SQL Hive - 计算前几个月的滚动 SUM、AVG

计算数据框中特定列(SUM、AVG、STDEV)的所有嵌套级别聚合