【问题标题】:Aggregation over multiple rows SQL Server 2008聚合多行 SQL Server 2008
【发布时间】:2013-07-02 15:41:32
【问题描述】:

这是此查询here 的扩展。我有一个当前正确的结果集,如下所示:

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。这就是我开始获得 wack-a-doo(技术术语)结果的地方。

这是我尝试获取每个部门的 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 子句:

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

没有一个内科号码是正确的。

【问题讨论】:

  • 请发布源数据和所需的输出。
  • 只是这样做了,抱歉,我一发布就意识到我没有这样做。
  • 我执行了以下操作,并根据 MED_STAFF_DEPT 获得了正确数量的患者 伪代码:select pv.med_staff_dept, count(pv.med_staff_dept)from smsmir.vst_rpt vrjoin smsdss.pract_dim_v pvjoin smsdss.pract_dim_v pvon vr.adm_pract_no = pv.src_pract_noWHERE statement from questiongroup by pv.med_staff_deptgroup by pv.med_staff_dept98765433@66 From clauseWhere clause

标签: sql sql-server sql-server-2008 tsql


【解决方案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'

通过在两个列选择语句中将 pv.spclty_desc 更改为 p.spclty_desc,问题得到解决。但是,这并没有告诉我为什么声明中只有内科失败,而其他两个没有失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 2012-02-20
    • 2015-03-07
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2011-02-16
    相关资源
    最近更新 更多