2013-07-02 6 views
2

Я пишу запрос, который должен дать мне count() и три avg(). count() работает просто отлично, но функции avg() возвращают ошибочные результаты. Данные, которые я работаю с выглядит следующим образом:SQL AVG() Возврат неверного результата для 3 столбцов

MD Name | PT | Med Staff | LOS | DRG Bench | LOS - Bench 
MCP  | 12345 | Ortho SX | 5 | 4  |  1 
MCP  | 25879 | Ortho SX | 3 | 5  |  -2 
MCP  | 98556 | Ortho SX | 4 | 5  |  -1 
... 

Мой Желаемая Выход:

MD Name | # PT | Med Staff | Avg LOS | Avg DRG Bench | AVG LOS - Bench 
MCP  | 3 | Ortho SX | 4 |  4.66 |  0 

Я получаю неверные результаты для средних значений. У меня есть один случай, в частности, где у меня есть следующие:

MD Name | LOS | Bench | LOS - Bench 
MCP  | 2.0000 | 1.8000 | 0.2000 
MCP  | 1.0000 | 1.7000 | -0.7000 
MCP  | 25.0000| 4.9000 | 20.1000 
MCP  | 4.0000 | 2.2000 | 1.8000 

Для и AVG LOS я получаю 9.000000 вместо 8.000000, для AVG Bench я получаю 2.780000 вместо 2,65 и для ЛОС-Bench Я нахожусь получая 6.220000 вместо 5.35, это существенные различия, и я должен быть прав до двух знаков после запятой.

Вот SQL я использую, SQL Server 2008

DECLARE @STARTDATE DATETIME 
DECLARE @ENDATE DATETIME 

SET @STARTDATE = '2013-05-01' 
SET @ENDATE = '2013-05-31' 

SELECT DISTINCT pv.pract_rpt_name AS 'PHYSICIAN' 
, COUNT(DISTINCT vr.pt_id) AS '# PTS' 
--, pv.spclty_desc AS 'SPECIALTY' 
, pv.med_staff_dept AS 'MED STAFF' 
, AVG(vr.len_of_stay) AS 'LOS' 
, AVG(vr.drg_std_days_stay) AS 'DRG LOS BENCH' 
, AVG(vr.len_of_stay - vr.drg_std_days_stay) AS 'LOS - DRG BENCH' 

FROM smsmir.vst_rpt vr 
LEFT OUTER JOIN smsmir.pyr_plan pp <-- removed and fixed 
ON vr.pt_id = pp.pt_id <-- removed and fixed 
JOIN smsdss.pract_dim_v pv 
ON vr.adm_pract_no = pv.src_pract_no 

WHERE vr.adm_dtime BETWEEN @STARTDATE AND @ENDATE 
AND vr.vst_type_cd = 'I' 
AND pv.spclty_desc != 'NO DESCRIPTION' 
--AND pv.spclty_desc NOT LIKE 'HOSPITALIST%' 
AND vr.drg_std_days_stay IS NOT NULL 
AND pv.pract_rpt_name != '?' 
AND pv.orgz_cd = 's0x0' 
AND pv.med_staff_dept IN (
'INTERNAL MEDICINE', 
'FAMILY PRACTICE', 
'SURGERY' 
) 
GROUP BY pv.pract_rpt_name, pv.med_staff_dept 
ORDER BY pv.med_staff_dept, AVG(vr.len_of_stay - vr.drg_std_days_stay)DESC 

Спасибо за ваше время и усилия.

+0

Что такое тип данных исходных столбцов? – Rikalous

+2

У вас есть ВЗАИМОДЕЙШИЙ ПРИСОЕДИНЯЙТЕСЬ к таблице, которая, как представляется, не используется в какой-либо точке запроса. Попробуйте удалить это предложение и посмотреть, не возникла ли проблема. – Rikalous

+2

Я бы сказал, что запрос, вероятно, будет содержать больше строк, чем вы думаете. 'Count', вероятно, правильный из-за' DISTINCT'. –

ответ

1

ВЗАИМОДЕЙШИЙ СОЕДИНЕНИЕ, которое у вас есть в запросе, может влиять на количество строк, над которыми работает функция AVG. Если вам это не нужно (и я не вижу нигде, где эта таблица ссылается в другом месте вашего запроса), попробуйте удалить ее.

1

Единственная возможность является наличие NULL-х в строках в таблице выбирает ... если есть нулевой колонка AVG будет игнорировать его, вместо того чтобы считать его ...

DECLARE @STARTDATE DATETIME 
DECLARE @ENDATE DATETIME 

SET @STARTDATE = '2013-05-01' 
SET @ENDATE = '2013-05-31' 

SELECT DISTINCT pv.pract_rpt_name AS 'PHYSICIAN' 
, COUNT(DISTINCT vr.pt_id) AS '# PTS' 
--, pv.spclty_desc AS 'SPECIALTY' 
, pv.med_staff_dept AS 'MED STAFF' 
, AVG(ISNULL(vr.len_of_stay,0)) AS 'LOS' 
, AVG(ISNULL(vr.drg_std_days_stay,0)) AS 'DRG LOS BENCH' 
, AVG(ISNULL((vr.len_of_stay - vr.drg_std_days_stay),0)) AS 'LOS - DRG BENCH' 

FROM smsmir.vst_rpt vr 
LEFT OUTER JOIN smsmir.pyr_plan pp 
ON vr.pt_id = pp.pt_id 
JOIN smsdss.pract_dim_v pv 
ON vr.adm_pract_no = pv.src_pract_no 

WHERE vr.adm_dtime BETWEEN @STARTDATE AND @ENDATE 
AND vr.vst_type_cd = 'I' 
AND pv.spclty_desc != 'NO DESCRIPTION' 
--AND pv.spclty_desc NOT LIKE 'HOSPITALIST%' 
AND vr.drg_std_days_stay IS NOT NULL 
AND pv.pract_rpt_name != '?' 
AND pv.orgz_cd = 's0x0' 
AND pv.med_staff_dept IN (
'INTERNAL MEDICINE', 
'FAMILY PRACTICE', 
'SURGERY' 
) 
GROUP BY pv.pract_rpt_name, pv.med_staff_dept 
ORDER BY pv.med_staff_dept, AVG(vr.len_of_stay - vr.drg_std_days_stay)DESC 
Смежные вопросы