一、场景引入:为什么「DRG 入组异常」是医保结算的「隐形失血」?

[!example] 一个真实的月底
月底,医保局结算清单发回来,某三甲医院发现:

「本月 DRG 拒付 47 例,扣款金额 ¥186,000。」

信息科调出 47 例明细,发现:

  • 12 例「低码高套」 —— 实际是简单手术,病历写成复杂手术,被医保局识别;
  • 18 例「歧义病例」 —— 主诊选择有争议,可以入「高权重组」也可以入「低权重组」;
  • 9 例「误入组」 —— 应该是内科组,误入了外科组;
  • 8 例「主诊错误」 —— 主诊 ICD 选择错误,导致整组偏移。

一个月损失 18.6 万,一年就是 220 万。

这是绝大多数医院都在面临的「隐形失血」:

异常类型 原因 损失量级
低码高套 主诊/手术编码虚高 单例 ¥500-5000
歧义病例 主诊选择可左可右 单例 ¥200-2000
误入组 编码错误导致入错 DRG 组 单例 ¥1000-10000
主诊错误 主诊未选主要诊断 单例 ¥300-3000
入组编码缺失 关键诊断/手术未填 单例 ¥500-5000

[!quote] 狼叔的判断
“DRG 入组异常不是’编码员的事’,是’全院的事’。” 这一期,教你用 SQL 在「医保结算前」就发现这些异常,把损失堵在源头


二、工具原理:DRG 入组异常的核心机制

2.1 DRG 是什么?

[!info] DRG/CHS-DRG 简介
DRG(Diagnosis Related Groups,疾病诊断相关分组) 是按「疾病诊断 + 治疗方式」把病案分入不同组的医保支付方式。

中国用的是 CHS-DRG(China Healthcare Security DRG),分组逻辑大致是:

  1. 先按 主要诊断(MDC) 分为 26 大类(内科、外科等);
  2. 再按 主要操作 细分(手术 / 操作 / 非手术);
  3. 最后按 并发症/合并症(CC/MCC)、年龄、合并症等微调;
  4. 最终每例病案落入一个 ADRG 组,组内有不同权重(权重 × 费率 = 支付金额)。

2.2 入组异常的 5 大类型

[!TIP] 5 大异常类型

① 低码高套(Upcoding)

  • 表现:编码「虚高」,把简单病案编入复杂 DRG 组,获得更高支付
  • 医保惩罚:拒付 + 罚款(最高 5 倍)

② 歧义病例(Ambiguous Cases)

  • 表现:主诊选择不明确,可以入高权重组也可以入低权重组
  • 关键:编码员习惯 + 临床医生主诊书写规范

③ 误入组(Mis-grouping)

  • 表现:应该是 A 组,实际入了 B 组(编码错误)
  • 关键:主诊 ICD 与手术 ICD 不匹配

④ 主诊错误(Principal Diagnosis Error)

  • 表现:主诊未选「消耗医疗资源最多的疾病」
  • 关键:DRG 分组只看主诊,副诊不影响权重

⑤ 入组编码缺失(Missing Codes)

  • 表现:关键诊断/手术未填,导致入到「不分组」或低权重组
  • 关键:确保所有重要诊断和手术都已编码

2.3 用 SQL 筛查的核心思路

[!example] 核心思路:对比「实际入组」vs「理论入组」
大部分入组异常 = 「实际入组」和「理论入组」不一致

  • 实际入组:HIS 系统根据病案首页自动入组的结果
  • 理论入组:根据主要诊断 + 主要操作,理论上应该入的组

我们要用 SQL 把「不一致」的找出来。


三、医院实战:5 类异常筛查 SQL

3.1 异常 ①:低码高套筛查

[!example] 实战 ①:低码高套
核心逻辑:同科室、同主诊,但「实际入组权重」远高于「上 3 个月同主诊的中位权重」,疑似高套

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
WITH 病案权重 AS (
SELECT
a.病案号,
a.科室,
a.主诊ICD,
b.入组编码,
b.DRG权重,
c.主诊名称,
-- 计算「同主诊的历史中位权重」
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY b.DRG权重)
OVER (PARTITION BY a.主诊ICD) AS 历史中位权重
FROM 首页主表 a
LEFT JOIN DRG入组表 b ON a.病案号 = b.病案号
LEFT JOIN ICD字典表 c ON a.主诊ICD = c.ICD编码
WHERE a.出院日期 >= '2026-06-01'
AND a.出院日期 < '2026-07-01'
)
SELECT *
FROM 病案权重
WHERE DRG权重 > 历史中位权重 * 1.5 -- 权重超过历史中位 50%,疑似高套
ORDER BY DRG权重 DESC;

[!warning] 「1.5 倍」是经验阈值
实际阈值可以根据医院历史数据调,建议先用 1.5 跑一遍,看命中数量,再调。

3.2 异常 ②:歧义病例筛查

[!example] 实战 ②:歧义病例
核心逻辑:同一病案号有多个主诊 ICD(诊断表里「诊断类型 = ‘主诊’」有 2 条以上),或者主诊与重要副诊的关联度低。

1
2
3
4
5
6
7
8
9
-- 主诊 ICD 多选(诊断表里主诊类型超过 1 条)
SELECT
病案号,
COUNT(*) AS 主诊条数,
GROUP_CONCAT(ICD编码) AS 主诊列表
FROM 诊断表
WHERE 诊断类型 = '主诊'
GROUP BY 病案号
HAVING COUNT(*) > 1;

[!TIP] 进一步筛查:主诊与重要操作不匹配
病案主诊是「肺部感染」(内科病),但主要操作是「胸腔镜手术」(外科操作),这种「内科主诊 + 外科操作」通常是歧义病例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
a.病案号,
a.主诊ICD,
a.主诊名称,
b.主要操作ICD,
b.主要操作名称,
c.MDC组,
c.ADRG组
FROM 首页主表 a
LEFT JOIN 手术表 b ON a.病案号 = b.病案号 AND b.主要操作标记 = 1
LEFT JOIN DRG入组表 c ON a.病案号 = c.病案号
WHERE a.出院日期 >= '2026-06-01'
AND a.出院日期 < '2026-07-01'
AND c.MDC组 = 'MDCE' -- MDCE = 内科组
AND b.主要操作ICD IS NOT NULL;

3.3 异常 ③:误入组筛查(主诊 vs 操作不匹配)

[!example] 实战 ③:误入组
核心逻辑:根据主诊 + 主要操作,理论应该入的 MDC 组 ≠ 实际入组 MDC 组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-- 用 CASE WHEN 推算「理论 MDC 组」
SELECT
a.病案号,
a.主诊ICD,
a.主诊名称,
b.主要操作ICD,
b.主要操作名称,
c.MDC组 AS 实际MDC组,
CASE
WHEN b.主要操作ICD IS NOT NULL AND LEFT(b.主要操作ICD, 3) IN ('01', '02', '03') THEN 'MDCA'
WHEN b.主要操作ICD IS NOT NULL AND LEFT(b.主要操作ICD, 3) IN ('04', '05', '06') THEN 'MDCB'
WHEN b.主要操作ICD IS NOT NULL THEN 'MDCC' -- 其他外科
ELSE 'MDCE' -- 内科组
END AS 理论MDC组,
CASE
WHEN c.MDC组 != CASE
WHEN b.主要操作ICD IS NOT NULL AND LEFT(b.主要操作ICD, 3) IN ('01', '02', '03') THEN 'MDCA'
WHEN b.主要操作ICD IS NOT NULL AND LEFT(b.主要操作ICD, 3) IN ('04', '05', '06') THEN 'MDCB'
WHEN b.主要操作ICD IS NOT NULL THEN 'MDCC'
ELSE 'MDCE'
END THEN '⚠️ 疑似误入组'
ELSE '✅ 正常'
END AS 校验结果
FROM 首页主表 a
LEFT JOIN 手术表 b ON a.病案号 = b.病案号 AND b.主要操作标记 = 1
LEFT JOIN DRG入组表 c ON a.病案号 = c.病案号
WHERE a.出院日期 >= '2026-06-01'
AND a.出院日期 < '2026-07-01';

[!TIP] 把这段保存为「DRG 校验视图」
每次结算前先跑一次,所有「⚠️ 疑似误入组」的病案让编码员复核

3.4 异常 ④:主诊选择错误筛查

[!example] 实战 ④:主诊错误
核心逻辑:副诊里有「消耗医疗资源更多」的疾病,但主诊选了消耗更少的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- 找出「副诊有重症(MCC),但主诊选了轻症」的病案
SELECT
a.病案号,
a.主诊ICD AS 当前主诊,
c1.ICD名称 AS 当前主诊名称,
d.副诊MCC_ICD,
c2.ICD名称 AS 副诊MCC名称,
-- 检查副诊是否更「重」
CASE
WHEN c2.是否MCC = 1 THEN '⚠️ 副诊是 MCC,应该考虑作为主诊'
ELSE '✅'
END AS 提示
FROM 首页主表 a
LEFT JOIN 诊断表 d ON a.病案号 = d.病案号 AND d.诊断类型 = '副诊'
LEFT JOIN ICD字典表 c1 ON a.主诊ICD = c1.ICD编码
LEFT JOIN ICD字典表 c2 ON d.ICD编码 = c2.ICD编码
WHERE c2.是否MCC = 1
AND a.出院日期 >= '2026-06-01'
ORDER BY a.病案号;

3.5 异常 ⑤:入组编码缺失筛查

[!example] 实战 ⑤:编码缺失
核心逻辑:病案实际做了手术,但手术表里没有对应 ICD 编码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
a.病案号,
a.科室,
a.出院日期,
-- 检查「病案首页上写了手术名称,但手术表没编码」
CASE
WHEN a.手术名称 IS NOT NULL AND b.手术ICD IS NULL THEN '⚠️ 手术未编码'
ELSE '✅'
END AS 提示
FROM 首页主表 a
LEFT JOIN 手术表 b ON a.病案号 = b.病案号
WHERE a.手术名称 IS NOT NULL
AND a.出院日期 >= '2026-06-01'
AND b.手术ICD IS NULL;

四、避坑指南:5 个让 DRG 筛查「失真」的常见错误

[!warning] 雷区 ①:用「HIS 入组结果」当作「真实入组结果」
症状:HIS 系统的入组算法和医保局不同,医院内自检正常,医保局拒付
解决:用医保局下发的入组规则(或第三方 DRG 分组器)做基准。

[!warning] 雷区 ②:权重阈值拍脑袋
症状:1.5 倍阈值定的太高,漏掉真实高套;太低,误报一堆
解决:先用 1.0、1.2、1.5、2.0 跑几遍,看命中率,再选平衡值。

[!warning] 雷区 ③:不区分医院等级
症状:三甲医院和二甲医院用同一套阈值,不适用
解决:分医院等级(三级/二级)、分专科维护阈值。

[!warning] 雷区 ④:只看错误数,不看错误率
症状:骨科错误数 28 条,看着多,但骨科总病案 1000 条;而消化科 12 条,总病案 100 条,实际消化科错误率更高。
解决:用错误率排序(参见第 09 期)。

[!warning] 雷区 ⑤:跑完 SQL 不复核,直接修改病案
症状:发现疑似异常,直接改病案主诊,触犯「病案涂改」红线
解决:SQL 只做筛查,修改病案必须有医生/编码员书面复核


五、把 SQL 沉淀为「定期任务」

[!TIP] 实战:配置月度自动筛查

Step 1:把上面的 SQL 保存为 drg_异常筛查.sql

Step 2:用 Navicat 创建「查询计划」,每月 28 日自动跑

Step 3:把结果导出 Excel,自动发送给编码员 + 质管办

Step 4:编码员在 Excel 里标注意见,质管办汇总成报告


六、下期预告

[!quote] 第 11 期
PostgreSQL 入门 —— 为什么医学界更推荐它

MySQL 之外,这一期介绍医学界更推崇的 PostgreSQL,以及它在病案存储、医学术语、地理信息检索方面的独特优势。


[!TIP] 互动
如果你觉得这篇「医数智联·第 10 期」对你有用,请点赞、在看、转发给科里的同事。

我是白衣狼,一个用数字化工具把医院管理做「轻」的实战派。咱们下期见。