组的平均值不正确

时间:2018-12-19 16:21:49

标签: sql-server tsql

我的查询就是这样...

SELECT
   ClientId,
   AVG(Rate)
FROM
  Clients
GROUP BY
   ClientId
WITH ROLLUP

这给...

NULL, 17.5769
1, 16.75
2, 17.50
3, 18.50
4, 17.50
5, 18.50

这是错误的平均值。应该是17.75。

此查询出了什么问题?

2 个答案:

答案 0 :(得分:5)

您误会了平均值的计算方式。如果您要计算组平均值的avg ,则会看到您期望的17.75

select ClientID
        ,avg(Rate) as AvgRate
from (values(1, 16.75)
           ,(2, 17.50)
           ,(3, 18.50)
           ,(4, 17.50)
           ,(5, 18.50)
    ) as r(ClientID, Rate)
group by ClientID
with rollup;

输出

+----------+-----------+
| ClientID |  AvgRate  |
+----------+-----------+
| 1        | 16.750000 |
| 2        | 17.500000 |
| 3        | 18.500000 |
| 4        | 17.500000 |
| 5        | 18.500000 |
| NULL     | 17.750000 |
+----------+-----------+

因为您使用的是with rollup,所以它(正确地)计算了整个数据集的平均值作为您的总值 的平均值,该平均值与计算小组平均值的平均值。

答案 1 :(得分:3)

平均值的平均值与所有值的平均值不同。请执行以下操作:

SELECT a,
       AVG(b) AS AvB
FROM (VALUES (1, 5.0),
             (1, 7.0),
             (2, 9.0),
             (3, 4.0),
             (3, 5.0),
             (4, 6.0)) V (a, b)
GROUP BY a;

SELECT AVG(b) AS AvAll
FROM (VALUES (1, 5.0),
             (1, 7.0),
             (2, 9.0),
             (3, 4.0),
             (3, 5.0),
             (4, 6.0)) V (a, b);

WITH CTE AS(
    SELECT a,
           AVG(b) AS AvB
    FROM (VALUES (1, 5.0),
                 (1, 7.0),
                 (2, 9.0),
                 (3, 4.0),
                 (3, 5.0),
                 (4, 6.0)) V (a, b)
    GROUP BY a)
SELECT AVG(AvB) AS AvgOfAvg
FROM CTE;

这给出了以下结果:

a           AvB
----------- ---------------------------------------
1           6.000000
2           9.000000
3           4.500000
4           6.000000

AvAll
---------------------------------------
6.000000

AvgOfAvg
---------------------------------------
6.375000

请注意,最后2个结果不同。您位于第三个数据集中的值之后,但是,您正在执行的聚集是第二个。