日期:2014-05-16  浏览次数:20722 次

有关医疗审计的一个SQL查询语句
小弟现在有这么一个问题:一个审计项目,数据库里面两张表,表结构如下(为方便描述,简化):
收费项目表
医疗服务序号 名称 收费标准 医保类型 每日收费次数限制
收费明细表
收费单编码 收费日期 医疗服务序号 病人姓名 就诊卡号 数量 金额
有的医疗项目的每天收费次数是有限制的,现在的需求是要求找出所有的收费次数超过限制的收费项目(一个收费单下的收费项目可以交多次的钱,也就是收费明细表的数量字段),搞了半天,自己弄不明白(group by 和having不会用啊)

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

having 就是过滤 group by分组聚合后的结果的

select 医疗服务序号 ,count(1) from A inner join B on A. 医疗服务序号 =B. 医疗服务序号 
group by  医疗服务序号 
having count(1)>N
 SORRY,我没说清楚,是要把收费明细表里一天之内收费次数总和超过限制的收费记录取出来,


简化了一下



create table 收费项目表
(
Categoryid char(10),
CategoryName varchar(20),
times int
)
insert into 收费项目表 values ('A','项目A',2)
insert into 收费项目表 values ('B','项目A',3)

create table 收费明细表
(
DetailID varchar(50),
Categoryid varchar(10),
CreateDate datetime
)

insert into 收费明细表 values ('1','A',GETDATE())
insert into 收费明细表 values ('2','A',GETDATE())
insert into 收费明细表 values ('3','A',GETDATE())
insert into 收费明细表 values ('4','B',GETDATE())
insert into 收费明细表 values ('5','B',GETDATE())


select * from
(
select distinct A.Categoryid,A.CategoryName,COUNT(1) over(partition by A.Categoryid) as facttimes,A.times
from 收费项目表 A inner join 收费明细表 B on A.Categoryid=B.Categoryid
)t where t.facttimes>t.times


,是要取收费明细表里一天之内收费次数超过限制的记录,不是去超过限制的收费项目


那不是一样吗

select * from
(
select distinct B.*,COUNT(1) over(partition by A.Categoryid) as facttimes,A.times
from 收费项目表 A inner join 收费明细表 B on A.Categoryid=B.Categoryid where create=‘查询日期’
)t where t.facttimes>t.times