2013-07-02 150 views
1

这是此查询here的扩展。我有一个结果集,目前是正确的,看起来像这样:多行聚合SQL Server 2008

MD Name | # PTS | Med Staff | AVG LOS | AVG Bench LOS | AVG DIFF 
MCP  | 4 | Ortho SX | 8.000000| 2.650000  | 5.350000 

我想添加到这个结果,患者总数见过的部门和相同的平均值但对于部门作为一个整体。通过执行以下操作,我可以使每个部门的总患者总结得当,作为另一列添加到上面的原始查询中。

(SELECT 
    COUNT(DISTINCT V.PT_ID) 
    FROM smsdss.pract_dim_v p 
    JOIN smsmir.vst_rpt v 
    on v.adm_pract_no = p.src_pract_no 
    WHERE pv.med_staff_dept = p.med_staff_dept 
    AND v.adm_dtime BETWEEN @STARTDATE AND @ENDATE 
    AND v.vst_type_cd = 'I' 
    AND p.spclty_desc != 'NO DESCRIPTION' 
    --AND pv.spclty_desc NOT LIKE 'HOSPITALIST%' 
    AND v.drg_std_days_stay IS NOT NULL 
    AND p.pract_rpt_name != '?' 
    AND p.orgz_cd = 's0x0' 
    AND p.med_staff_dept IN (
    'INTERNAL MEDICINE', 
    'FAMILY PRACTICE', 
    'SURGERY' 
    ) 
) AS '# PTS For Dept' 

我手动检查了总和,他们是正确的。我知道想要在p.med_staff_dept上添加AVG LOS,AVG BENCH LOS和AVG DIFF。这是我开始获得怪人(技术术语)结果的地方。

这里是我尝试每个部门得到AVG LOS部分:

(SELECT 
    AVG(v.len_of_stay) 
    FROM smsdss.pract_dim_v p 
    JOIN smsmir.vst_rpt v 
    ON v.adm_pract_no = p.src_pract_no 
    WHERE pv.med_staff_dept = p.med_staff_dept 
    AND v.adm_dtime BETWEEN @STARTDATE AND @ENDATE 
    AND v.vst_type_cd = 'I' 
    AND p.spclty_desc != 'NO DESCRIPTION' 
    --AND pv.spclty_desc NOT LIKE 'HOSPITALIST%' 
    AND v.drg_std_days_stay IS NOT NULL 
    AND p.pract_rpt_name != '?' 
    AND p.orgz_cd = 's0x0' 
    AND p.med_staff_dept IN (
    'INTERNAL MEDICINE', 
    'FAMILY PRACTICE', 
    'SURGERY' 
    ) 
) AS 'DEPT ALOS' 

我团伙的得到正确的数字时对Excel的检查,但行中间组是大大不正确,如所以:

# PTS FOR DEPT | DEPT ALOS 
330   | 5.284848 <-- SAME IN EXCEL 
737   | 4.952510 <-- EXCEL SHOWS 196 AND 6.214285 
111   | 3.072072 <-- SAME IN EXCEL 

这是我从查询中总条款:

FROM smsmir.vst_rpt vr 
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, pv.spclty_desc 
ORDER BY pv.med_staff_dept, AVG(vr.len_of_stay - vr.drg_std_days_stay)DESC 

所希望的最终输出:

MD NAME | # PTS | MED STAFF | AVG LOS | AVG BENCH | AVG DIFF | DEPT TOT | AVG LOS | AVG BNCH | AVG DIFF 
MCP  | 4 | Ortho SX | 8.000000| 2.650000 | 5.350000 | 300  | 4.990000| 4.500000 | 0.490000 

全码:

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 'AVG LOS' 
, AVG(vr.drg_std_days_stay) AS 'AVG DRG LOS BENCH' 
, AVG(vr.len_of_stay - vr.drg_std_days_stay) AS 'OPPORTUNITY' 
, (SELECT 
    COUNT(DISTINCT V.PT_ID) 
    FROM smsdss.pract_dim_v p 
    JOIN smsmir.vst_rpt v 
    on v.adm_pract_no = p.src_pract_no 
    WHERE pv.med_staff_dept = p.med_staff_dept 
    AND v.adm_dtime BETWEEN @STARTDATE AND @ENDATE 
    AND v.vst_type_cd = 'I' 
    AND p.spclty_desc != 'NO DESCRIPTION' 
    AND pv.spclty_desc NOT LIKE 'HOSPITALIST%' 
    AND v.drg_std_days_stay IS NOT NULL 
    AND p.pract_rpt_name != '?' 
    AND p.orgz_cd = 's0x0' 
    AND p.med_staff_dept IN (
    'INTERNAL MEDICINE', 
    'FAMILY PRACTICE', 
    'SURGERY' 
    ) 
) AS '# PTS For Dept' 
-- currently not working properly 
, (SELECT 
    AVG(V.len_of_stay) 
    FROM smsmir.vst_rpt v 
    JOIN smsdss.pract_dim_v p 
    ON v.adm_pract_no = p.src_pract_no 
    WHERE pv.med_staff_dept = p.med_staff_dept 
    AND v.adm_dtime BETWEEN @STARTDATE AND @ENDATE 
    AND v.vst_type_cd = 'I' 
    AND p.spclty_desc != 'NO DESCRIPTION' 
    AND pv.spclty_desc NOT LIKE 'HOSPITALIST%' 
    AND v.drg_std_days_stay IS NOT NULL 
    AND p.pract_rpt_name != '?' 
    AND p.orgz_cd = 's0x0' 
    AND p.med_staff_dept IN (
    'INTERNAL MEDICINE', 
    'FAMILY PRACTICE', 
    'SURGERY' 
    ) 
) AS 'DEPT ALOS' 

FROM smsmir.vst_rpt vr 
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, pv.spclty_desc 
ORDER BY pv.med_staff_dept, AVG(vr.len_of_stay - vr.drg_std_days_stay)DESC 

内科号没有被正确地往外冒。

+0

请发布源数据和期望的输出。 –

+0

只是做到了这一点,只要我发布我没有这样做,抱歉意识到。 –

+0

我做了以下,并获得每MED_STAFF_DEPT患者正确的号码 伪代码: '选择pv.med_staff_dept' ',计数(pv.med_staff_dept)' '从smsmir.vst_rpt vr' '加入smsdss.pract_dim_v pv' '上vr.adm_pract_no = pv.src_pract_no' 'WHERE从question' 声明 '通过pv.med_staff_dept' 组'UNION ALL' '选择 '总',计数(pv.med_staff_dept)' 'From clause' 'Where子句' –

回答

1

发现的问题就在这里:

, (SELECT 
    COUNT(DISTINCT V.PT_ID) 
    FROM smsdss.pract_dim_v p 
    JOIN smsmir.vst_rpt v 
    on v.adm_pract_no = p.src_pract_no 
    WHERE pv.med_staff_dept = p.med_staff_dept 
    AND v.adm_dtime BETWEEN @STARTDATE AND @ENDATE 
    AND v.vst_type_cd = 'I' 
    AND p.spclty_desc != 'NO DESCRIPTION' 
    AND pv.spclty_desc NOT LIKE 'HOSPITALIST%' <-- should be p.spclty not pv. 
    AND v.drg_std_days_stay IS NOT NULL 
    AND p.pract_rpt_name != '?' 
    AND p.orgz_cd = 's0x0' 
    AND p.med_staff_dept IN (
    'INTERNAL MEDICINE', 
    'FAMILY PRACTICE', 
    'SURGERY' 
    ) 
) AS '# PTS For Dept' 

通过在这两个列select语句的问题是固定的改变pv.spclty_desc到p.spclty_desc。但是,这并不能告诉我为什么在声明中只有内科医师失败,而不是其他两位。