关于SQL case when 判定的问题

一、先建个表 cbz2-查询记录300万条

select t.序号,

t.收费项目,t.收费项目编码

,t.数量,convert(char(20),t.费用日期,120) 费用日期

,t.金额,b.项目编码,b.项目名称,b其他价,t.金额-(b.二类价*t.数量) as 多收费用 inot cbz2

from

(select e.收费项目编码,b.序号,b.收费项目,cast(b.数量 as decimal(8,0)) 数量,

convert(char(20),b.费用日期,120) 费用日期
,cast(b.金额 as decimal(8,0)) 金额
from dbo.费用明细表 b
join dbo.收费项目目录表 e on b.收费项目编码=e.收费编码) t join
wb.[dbo].[收费对照表] b on t.收费项目编码=b.项目编码
where t.费用日期> '2019-01-01 00:00:00.000'
and
(select sum(金额) from [dbo].[费用明细表]
where 序号=t.序号 and abs(金额)=t.金额)>0 and 金额>0

group by t.序号,

t.收费项目名称,t.收费项目编码

,t.数量,费用日期

,t.金额,b.项目编码,b.项目名称,b.其他价

order by 5,10

二、之后用cbz2连接调价表与标准表查询的记录88万条

select a.序号,a.收费项目名称,a.收费项目编码,a.数量,a.金额,b.调后价格,a.费用日期

,case when a.费用日期 between '2019-01-01 00:00:00' and '2020-03-01 00:00:00' then

     a.金额-(c.其他价*a.数量)

when a.费用日期>'2020-03-01 00:00:00' then

     a.金额-(b.调后价格*a.数量) 

end 多收金额

from cbz2 a join [耗材调价表] b on a.收费项目编码=b.项目编码

join [收费对照表] c on a.收费项目编码=c.项目编码

group by a.序号,a.收费项目名称,a.收费项目编码,a.数量,a.金额,b.调后价格,a.费用日期

having (a.金额-(c.其他价a.数量)>0) or (a.金额-(b.调后价格a.数量)>0)

为什么 用了case when 后查询的记录会少了差不多120条记录啊??各位牛哥问题出在哪里啊!!

说明你有120条记录没覆盖在你所列出的 case条件内,又或者这两张表连接后,就没有这120条数据。