TSQL:如何替代NULLIF实现列值小于另一列15%时返回NULL?
解决Linespeed低于目标15%时返回NULL的CASE语句实现方案
嘿,我完全懂你的需求——你想把原来的NULLIF(Linespeed, 0)逻辑替换掉,改成当Linespeed低于Linespeed_Target的15%时返回NULL,同时还不能用WHERE子句过滤数据,因为'Avail OEE'需要统计所有Linespeed的值来计算,对吧?
其实用CASE语句就能完美解决这个问题,咱们直接把逻辑整合到你的Avg()函数里就行,不用动整个查询的结构。
修改后的'LS OEE'计算代码
原来的代码是:
Nullif(Round(Avg(Nullif(Linespeed, 0)) / Avg(LineSpeed_Target), 2), 0) as 'LS OEE'
我们把Nullif(Linespeed, 0)替换成CASE语句,判断Linespeed是否小于目标值的15%:
Nullif(Round(Avg(CASE WHEN Linespeed < Linespeed_Target * 0.15 THEN NULL ELSE Linespeed END) / Avg(LineSpeed_Target), 2), 0) as 'LS OEE'
逻辑说明
- CASE语句会逐个检查每行的Linespeed:如果它小于Linespeed_Target的15%,就返回NULL;否则返回Linespeed本身。
- Avg()函数在计算时会自动忽略NULL值,这和你原来用
NULLIF(Linespeed, 0)的效果一致,但逻辑更贴合你的新需求(而且还顺便覆盖了Linespeed为0的情况,因为0肯定小于正数的15%)。 - 最重要的是,这个修改只会影响'LS OEE'列的计算,不会过滤任何行数据,所以'Avail OEE'的统计完全不受影响——它依然可以使用原始的Linespeed列来计算所有值的数量。
为什么不用WHERE子句?
你提到的'Avail OEE'代码:
NullIF(Round(Cast(count(NULLIF(0 ,LineSpeed)) / Cast(Count(Linespeed) as float) as float), 2), 0) as 'Avail OEE'
这里的Count(Linespeed)是统计所有非NULL的Linespeed行数,count(NULLIF(0 ,LineSpeed))是统计Linespeed不等于0的行数。如果用WHERE子句过滤掉Linespeed低于15%的行,这两个计数都会不准确,所以在列层面用CASE处理是最优解。
这样改完之后,你的每日趋势分析查询就能按照新逻辑计算'LS OEE',同时保证'Avail OEE'的统计数据完整啦。
内容的提问来源于stack exchange,提问作者Drew
相关产品推荐
相关产品推荐

