2013-07-02 41 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臺我得到2.780000,而不是2.65,爲LOS-臺我得到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

對查詢中的任何點都沒有使用的表有一個OUTER JOIN。嘗試刪除該條款並查看問題是否仍然存在。 – Rikalous

+2

我想說,查詢可能會得到比您想象的更多的行。由於「DISTINCT」,「計數」可能是正確的。 –

回答

1

您在查詢中擁有的OUTER JOIN可能會影響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