【问题标题】:Performing an AVG on a calculated SUM value对计算的 SUM 值执行 AVG
【发布时间】: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(),您需要多个值来计算平均值。你能提供更多细节吗

标签: sql sql-server-2008 tsql aggregate-functions


【解决方案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
    . . .
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2021-12-17
      相关资源
      最近更新 更多