/ / SQL Server AVG i Excel AVERAGE produkujące różne wyniki? - sql-server, excel, średnia

SQL Server AVG i Excel AVERAGE dają różne wyniki? - sql-server, excel, średnia

Próbuję pokazać średnie na serwerze SQL, ale kiedy testuję dane w Excelu, wyniki nie są takie same, musi być coś oczywistego, czego mi brakuje.

Oto kod i wyniki z serwera 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

wprowadź opis obrazu tutaj

Oto wyniki w programie Excel:

wprowadź opis obrazu tutaj

Dzięki

Odpowiedzi:

3 dla odpowiedzi № 1

Wypróbuj to dla zabawy:

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

avg(a)
-------
2

AVG () zwraca ten sam typ danych, co kolumna podstawowa. Jeśli twoje kolumny są typu int, wtedy wynik zostanie obcięty do int także. Poniższy tekst zwraca "poprawny" wynik.

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

result
--------
2.5

Rozbieżność, którą pokazujesz (24 vs 19.50484) najprawdopodobniej będzie wiązał się z innym błędem w związku z tym. Na przykład, aby sprawdzić, czy podsumowujesz te same dane w programie Excel, jak w SQL Server, zrzuć ten wynik do programu Excel i podsumuj go. Jeśli nie pasuje to, co obecnie uważasz, że jest Excel odpowiednik danych SQL Server, wyrównaj kolumny i sprawdź, czy mają taką samą liczbę wierszy. Następnie posortuj każdą kolumnę indywidualnie według wartości ASCENDING i porównaj ponownie.

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