我正在寫一個應該給我一個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
謝謝您的時間和精力。
是什麼源列的數據類型? – Rikalous
對查詢中的任何點都沒有使用的表有一個OUTER JOIN。嘗試刪除該條款並查看問題是否仍然存在。 – Rikalous
我想說,查詢可能會得到比您想象的更多的行。由於「DISTINCT」,「計數」可能是正確的。 –