2013-04-24 2 views
1

Я пытаюсь показать средние значения на SQL-сервере, но когда я тестирую данные в Excel, результаты не совпадают, должно быть что-то очевидное, что мне не хватает.SQL Server AVG и Excel AVERAGE дают разные результаты?

Вот код и результаты от сервера 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 

enter image description here

Вот результаты в Excel:

enter image description here

Благодарности

ответ

3

Попробуйте для Веселье:

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, поместите столбцы вверх и проверьте, что они имеют одинаковое количество строк. Затем отсортируйте каждый столбец отдельно по значению 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 
+0

Спасибо за ваш ответ Ричард, но я просто попробовал это, и он не работает, он просто производит десятичный результат 24.412407? есть идеи? – Will

+0

Я подчеркивал тот факт, что AVERAGE Excel создает реальное число с плавающей запятой, но SQL Server будет следовать типу базового столбца. Я уже прокомментировал, что у вас есть другие проблемы. Не показывая все ваши данные, проверить невозможно. Существует так много способов сделать ошибки копирования данных из SQL Server в Excel. – RichardTheKiwi

+0

Спасибо, данные excel создаются из небольшого варианта запроса в моем исходном вопросе, поэтому данные должны быть точными. – Will

Смежные вопросы