提问人:RiotF 提问时间:2/15/2021 最后编辑:RiotF 更新时间:2/16/2021 访问量:1033
在 case 语句中使用 Max(boolean)
Using Max(boolean) in a case statement
问:
我在数据库中制作了一个临时帐户表,其中包含提供有关帐户的见解的布尔值。有些客户有多个帐户,所以我将它们分组在一起,并尝试查看 MAX(布尔值)来设置状态字段。
我的查询有点像:
with t as (Select lngCustomerNumber,
Case
When 'Criteria for being Active' Then 1
End as blnActive,
Case
When 'Criteria for unexpired' Then 1
End as blnUnexpired
From AccountTable)
Select t.CustomerNumber,
Case
When Max(t.blnActive) = 1
AND Max(t.blnUnexpired) = 1 Then 'Active/Unexpired'
When Max(t.blnActive) = 1
AND Max(t.blnUnexpired) = 0 Then 'Active/Expired'
When Max(t.blnActive) = 0
AND Max(t.blnUnexpired) = 1 Then 'Inactive/Unexpired'
When Max(t.blnActive) = 0
AND Max(t.blnUnexpired) = 0 Then 'Inactive/Expired'
End As strLicenseStatus
From T
Group By t.CustomerNumber
它检查 Max(Boolean) = 1 是否正确计算为 True 的任何内容,但是如果我执行 Max(Boolean) = 0 或 Max(Boolean) <> 1,那么它不会在应该计算为 True 时。 我通过查看分组的 Temp Table 进行了测试,每个布尔值都返回其 Max() 值,而应该为 0 的值返回为 0。
作为解决方法,我尝试过
Where t.CustomerNumber NOT IN (SELECT t2.CustomerNumber
FROM t t2
WHERE t2.blnUnexpired = 1
AND t2.CustomerNumber = t.CustomerNumber )
这确实给了我正在寻找的结果,但我有数百万行返回,所以它在几个小时后超时了,而以前的方法能够在不到一个小时的时间内运行。
我的查询中还有其他一些数据,显示的数据是一个更小的版本,用于突出显示我的问题。
关于我如何做到这一点的任何建议? 谢谢。
答:
0赞
eaolson
2/16/2021
#1
定义 and 案例时,只定义了“1”个案例,这意味着如果它不满足这些条件,它将为 null。尝试添加到每个案例中:blnActive
blnUnexpired
else 0
with t as (Select lngCustomerNumber,
Case
When 'Criteria for being Active' Then 1
Else 0
End as blnActive,
Case
When 'Criteria for unexpired' Then 1
Else 0
End as blnUnexpired
From AccountTable)
评论