【问题标题】:SQL Server AVG and Excel AVERAGE producing different results?SQL Server AVG 和 Excel AVERAGE 产生不同的结果?
【发布时间】:2013-04-24 09:55:11
【问题描述】:

我试图在 SQL Server 上显示平均值,但是当我在 Excel 中测试数据时结果不一样,肯定有一些明显的我遗漏了。

这是来自 SQL 服务器的代码和结果:

SELECT DISTINCT
d.d_reference + ' - ' + d.d_name AS Faculty,
AVG(sub.GroupSize) AS FacultyAverage


FROM
unitesnapshot.dbo.capd_register r
INNER JOIN unitesnapshot.dbo.capd_studentregister sr ON sr.sr_register = r.r_id
INNER JOIN unitesnapshot.dbo.capd_activity a ON a.a_register = r.r_id
INNER JOIN unitesnapshot.dbo.capd_moduleactivity ma ON ma.ma_activity = a.a_id
INNER JOIN unitesnapshot.dbo.capd_module m ON m.m_id = ma.ma_activitymodule
INNER JOIN unitesnapshot.dbo.capd_department d ON d.d_id = m.m_moduledept
INNER JOIN unitesnapshot.dbo.capd_section sec ON sec.s_id = m.m_modulesection
INNER JOIN (SELECT
            r.r_reference,
            COUNT(DISTINCT s.s_studentreference) AS GroupSize
            FROM
            unitesnapshot.dbo.capd_student s
            INNER JOIN unitesnapshot.dbo.capd_person p ON p.p_id = s.s_id
            INNER JOIN unitesnapshot.dbo.capd_studentregister sr ON sr.sr_student = p.p_id
            INNER JOIN unitesnapshot.dbo.capd_register r ON r.r_id = sr.sr_register
            GROUP BY
            r.r_reference) sub ON sub.r_reference = r.r_reference

WHERE
SUBSTRING(r.r_reference,4,2) = '12' AND
d.d_reference = '730'

GROUP BY
d.d_reference,
d.d_name

这是 Excel 中的结果:

谢谢

【问题讨论】:

    标签: sql-server excel average


    【解决方案1】:

    试试这个好玩:

    select avg(a)
    from
        (values(1),(2),(3),(4)) x(a);
    
    avg(a)
    -------
    2
    

    AVG() 返回与基列相同的数据类型。如果您的列是 int 类型,那么结果也将被截断为 int。下面返回“正确”的结果。

    select avg(cast(a as decimal(10,5)))
    from
        (values(1),(2),(3),(4)) x(a);
    
    result
    --------
    2.5
    

    您显示的差异(24 与 19.50484)很可能涉及与此相关的另一个错误。例如,要检查您在 Excel 中汇总的数据是否与在 SQL Server 中的相同,请将此结果转储到 Excel 中并进行汇总。如果它与您当前认为的 SQL Server 数据的 Excel 等效 不匹配,请将列对齐并检查它们的行数是否相同。然后按值 ASCENDING 对每一列单独排序并再次比较。

    SELECT d.d_name, sub.GroupSize AS FacultyAverage
    FROM unitesnapshot.dbo.capd_register r
    INNER JOIN unitesnapshot.dbo.capd_studentregister sr ON sr.sr_register = r.r_id
    INNER JOIN unitesnapshot.dbo.capd_activity a ON a.a_register = r.r_id
    INNER JOIN unitesnapshot.dbo.capd_moduleactivity ma ON ma.ma_activity = a.a_id
    INNER JOIN unitesnapshot.dbo.capd_module m ON m.m_id = ma.ma_activitymodule
    INNER JOIN unitesnapshot.dbo.capd_department d ON d.d_id = m.m_moduledept
    INNER JOIN unitesnapshot.dbo.capd_section sec ON sec.s_id = m.m_modulesection
    INNER JOIN (SELECT r.r_reference,
                COUNT(DISTINCT s.s_studentreference) AS GroupSize
                FROM unitesnapshot.dbo.capd_student s
                INNER JOIN unitesnapshot.dbo.capd_person p ON p.p_id = s.s_id
                INNER JOIN unitesnapshot.dbo.capd_studentregister sr ON sr.sr_student = p.p_id
                INNER JOIN unitesnapshot.dbo.capd_register r ON r.r_id = sr.sr_register
                GROUP BY r.r_reference) sub ON sub.r_reference = r.r_reference
    WHERE SUBSTRING(r.r_reference,4,2) = '12' AND d.d_reference = '730'
    ORDER BY d.d_name
    

    【讨论】:

    • 感谢您的回答,Richard,但我刚刚尝试过,它不起作用,它只产生 24.412407 的十进制结果?有什么想法吗?
    • 我强调 Excel 的 AVERAGE 产生一个实数(浮点数)但 SQL Server 将遵循基列的类型这一事实。我已经评论说您还有其他问题。如果不显示所有数据,就无法检查。将数据从 SQL Server 复制到 Excel 时出错的方法有很多。
    • 谢谢,excel 数据是由我原来问题中的查询稍有变化产生的,所以数据应该是准确的。
    • 当我做 SUM(sub.GroupSize) AS FacultyAverage 我得到 2385556 但在 excel 中 sumn 显示 24186,这表明查询有问题吗?
    • 好的,感谢您的帮助,我会回溯数据并找到问题,我只是认为可能是查询的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多