SQL中的count()、sum()函数内加条件

最近在代码中有需要做页面统计数据总数,于是就按照条件规矩的表连接分组查询,先查出总数,然后对分组过后的数据进行单个查询。写完就跑了一下,发现查询速度有点慢(数据暂时还不多),想着以后数据多的话,页面会不会很慢,能不能一个sql,把所有的数量都查出来。这就用到了count()函数内加条件计数,测试了一下,数据正确,sql如下 :

 
select  a.卫生院顺序号,count(a.ID) as 体检总数,
count(case when a.是否高血压='是' then 1 else null end)as 高血压总数,
count(case when a.是否糖尿病='是' then 1 else null end)as 糖尿病总数,
count(case when a.是否脑卒中='是' then 1 else null end)as 脑卒中总数,
count(case when a.是否冠心病='是' then 1 else null end)as 冠心病总数
from  表  a   where YEAR(a.tjrq) = DATEPART(year, GETDATE())  GROUP BY a.机构号

还有一种方法就是

SELECT
    COUNT(1) AS '总数',
     COUNT (xjzt = '1' OR NULL) AS '状态1',
     COUNT (xjzt = '2' OR NULL) AS '状态2'
FROM
    t_table
WHERE
    sfsc = 0
GROUP BY
    '字段1',
    '字段2' 

至于为什么要or null     如count(xjzt= '1' or NULL) 这部分 为什么要加上or NULL 直接count(xjzt= '1' )有什么问题吗?不就是要找xjzt= '1' 的数据吗,为什么要计算NULL的数据

答案:

因为 当 xjzt 不是 1时 ,xjzt= '1' 结果false 不是 NULL,

Count在 值是NULL是 不统计数, (count('任意内容')都会统计出所有记录数,因为count只有在遇见null时不计数,即count(null)==0,因此前者单引号内不管输入什么值都会统计出所有记录数)至于加上or NULL , 很像其他编程里的or运算符,第一个表达式是true就是不执行or后面的表达式,第一个表达式是false 执行or后面的表达式 。当xjzt 不为1时xjzt= '1' or NULL 的结果是NULL,Count才不会统计上这条记录数 

下面sql语句意思为  按机构分组  查询每个机构中肝功能(肝功能其中包含血清谷丙、谷草、总胆红素,每个项目的超过指标即为异常)和心电图异常人数

 select 组织机构, 
sum(case when  ((case when xqgb='' then 0  when Cast(xqgb as decimal(10,2))>40 then 1 else 0 end)+(case when xqgc='' then 0 when Cast(xqgc as decimal(10,2))>40 then 1 else 0 end)+(case when zdhs='' then 0 when Cast(zdhs as decimal(10,2))>40 then 1 else 0 end))>0 then 1 else 0 end ) as 肝功能,
sum(case when 心电图='' or 心电图 is null then 0 when 心电图 like '%1%' then 0 else 1 end) as 心电图
from  表_健康体检表  group by 组织机构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香煎三文鱼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值