对计算的 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】:严格来说,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
. . .
【讨论】:
以上是关于对计算的 SUM 值执行 AVG的主要内容,如果未能解决你的问题,请参考以下文章
枢轴计算公式:SUM(Field1)/AVG(Field2)