1

我正在摆弄 MS SQL,运行这两个查询后得到不同的结果(......也许这只是我对 MS SQL 的业余爱好):

/* 如果你发现任何语法错误也没关系,我正在写这个 */


SELECT 
    AVG(X.AvgDailyExpense) AS AverageDailyExpense
FROM
    (SELECT
        AVG(we.DailyExpense) AS AvgDailyExpense
    FROM
        WorkerExpense we
        LEFT JOIN Worker w ON w.Id = we.WorkerId 
    GROUP BY
        w.Id) X;

SELECT
    AVG(we.DailyExpense) AS AverageDailyExpense
FROM
    WorkerExpense we
    LEFT JOIN Worker w ON w.Id = we.WorkerId;

WorkerExpense 和 Worker 之间有一个外键,WorkerExpense 表不可能引用不存在的工作行。此外,DailyExpense 是货币数据类型(也许这很重要?)。

现在,下层查询返回应该是正确的结果(我在少量行上手动计算了结果),上层查询总是返回一个大于它应该的值。

谁能更详细地解释一下为什么会发生这种情况?是因为数字四舍五入还是...?

4

3 回答 3

1

这些查询将返回不同的结果,因为它们正在回答不同的问题。第二个查询回答“所有每日费用报告的平均每日费用是多少”。第一个查询首先找到个人的平均每日费用,然后询问“基于个人的平均每日费用的平均值是多少”。他们正在回答非常不同的问题。

另一种思考方式是,第二个查询对拥有大量费用报告的个人给予更大的权重。第一个查询按个人规范化数据。

于 2013-10-28T19:41:29.400 回答
1

假设您有以下费用的工人:

A: 1, 2, 3, 4, 5, 6, 7, 8, 9   (average 45 / 9 = 5)
B: 12, 13, 14    (average 39 / 3 = 13)

所有费用的直接平均数是 (45 + 39) / 12 = 7,但两个工人的平均数是 (5 + 13) / 2 = 9。

于 2013-10-28T19:42:34.137 回答
1

这是两个不同的数学问题。考虑一个具有两个 WorkerExpense 条目的 Worker 组,它们是 0 和 3000。考虑具有一个 WorkerExpense 条目的第二个 Worker 组,它是 0。

您的第一个查询将首先找到两组的平均值,例如 1500 和 0,然后对这些数字进行平均,结果为 750。

您的第二个查询将对三个数字 0、3000 和 0 进行平均,结果为 1000。

这是两个不同的东西。你必须决定你想要哪一个。

于 2013-10-28T19:42:55.513 回答