应用场景: 需要根据印章的不同状态,统计不同状态下印章数量。

刚开始百度,确实写搜到了不同的答案,但只能怪自己对sql语法解读不够,还是没写出来,导致写出了下面错误的写法。
select b.corporateOrgName, b.corporateOrgGuid companyId, count(case when
bc.ftype not in(1,2) then 1 else 0 end ) total, count(case when bc.ftype
in(3,4,5) then 1 else 0 end ) usetotal, count(case when bc.ftype = 6 then 1
else 0 end ) saveTotal, count(case when bc.ftype = 7 then 1 else 0 end )
returnTotal from B_seal_cycle bc join B_seal b on bc.sealId = b.id where
b.corporateOrgName like '%%' group by b.corporateOrgName,b.corporateOrgGuid
逻辑上通了,可就是怎么都得不到理想的接口,这样写统计的每一个数据都一样呀。改变之后的正确写法
select b.corporateOrgName, b.corporateOrgGuid companyId, count(case when
bc.ftype not in(1,2) then 1 end ) total, count(case when bc.ftype in(3,4,5)
then 1 end ) usetotal, count(case when bc.ftype = 6 then 1 end ) saveTotal,
count(case when bc.ftype = 7 then 1 end ) returnTotal from B_seal_cycle bc join
B_seal b on bc.sealId = b.id where b.corporateOrgName like '%%' group by
b.corporateOrgName,b.corporateOrgGuid
你看出不同之处了嘛? 把else 0 去掉就得到了正确的结果。

<>遇到的问题

1、 对case when 语法,解读有误。
加了else 之后,总会对结果取 1 或 0.
2、 count函数都会对不管1 或 0 进行统计。
3、 当加了else 0 之后,可以通过sum函数进行统计。

也可以这样写
select b.corporateOrgName, b.corporateOrgGuid companyId, sum(case when
bc.ftype not in(1,2) then 1 else 0 end ) total, sum(case when bc.ftype
in(3,4,5) then 1 else 0 end ) usetotal, sum(case when bc.ftype = 6 then 1 else
0 end ) saveTotal, sum(case when bc.ftype = 7 then 1 else 0 end ) returnTotal
from B_seal_cycle bc join B_seal b on bc.sealId = b.id where b.corporateOrgName
like '%%' group by b.corporateOrgName,b.corporateOrgGuid
有问题,或者有更好的写法,感谢留言指出。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信