分组统计90天内患者配药量求和异常问题求助
问题分析与解决方案
嘿,我之前踩过一模一样的坑!你的分组查询结果异常的核心原因是GROUP BY子句里包含了不该有的字段,咱们一步步拆解:
问题出在哪?
你原来的SQL把dispense_amount、d.dispense_date都放进了GROUP BY里,但你的需求是按患者(person_id+全名)分组统计总配药金额。这些多余的字段会把同一个患者的不同配药记录拆分成多个独立分组:
dispense_amount是每条配药记录的金额,把它加入GROUP BY后,每个不同金额的记录都会单独成组,SUM的结果其实就是这条记录本身的金额,而不是该患者的总金额d.dispense_date是每条配药的日期,同一个患者可能有多次不同日期的配药,加入后会把同一患者的不同日期配药拆成多个组
这就是为什么单独查单个PID能得到正确总金额(没有错误分组,直接SUM所有符合条件的记录),但分组查询结果不对的原因。
修正后的SQL
咱们把GROUP BY精简到只保留唯一标识患者的字段(以及和患者一一对应的字段,比如gender),同时用更规范的JOIN语法替代旧的逗号连接:
SELECT SUM(d.dispense_amount) AS total_dispense_amount, p.full_name, p.person_id, p.gender FROM dispense d INNER JOIN patients p ON d.pid = p.pid WHERE d.dispense_date >= SYSDATE - 90 GROUP BY p.person_id, p.full_name, p.gender;
这里的逻辑是:
- 用
INNER JOIN关联配药表和患者表,确保只统计有对应患者信息的配药记录 - GROUP BY只保留
person_id(患者唯一主键)、full_name、gender——因为同一个person_id的姓名和性别是唯一的,不会拆分分组 - SUM函数会计算每个患者分组下所有90天内配药金额的总和
扩展:如果需要显示配药日期相关信息
如果你想展示该患者的配药日期范围(比如最早/最晚配药日期),不能直接把单个dispense_date放进GROUP BY,而是用聚合函数获取:
SELECT SUM(d.dispense_amount) AS total_dispense_amount, p.full_name, p.person_id, p.gender, MIN(d.dispense_date) AS earliest_dispense_date, MAX(d.dispense_date) AS latest_dispense_date FROM dispense d INNER JOIN patients p ON d.pid = p.pid WHERE d.dispense_date >= SYSDATE - 90 GROUP BY p.person_id, p.full_name, p.gender;
内容的提问来源于stack exchange,提问作者PKGrem
相关产品推荐
相关产品推荐

