sql - 在 case 语句中使用 Max(boolean)
问题描述
我在数据库中创建了一个临时帐户表,其中包含提供有关帐户的洞察力的布尔值。有些客户有多个帐户,所以我将它们分组在一起,并试图查看 MAX(Boolean) 来设置状态字段。
我的查询有点像:
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 表进行了测试,每个布尔值带回其 Max() 值,而应该为 0 的值返回为 0。
作为一种解决方法,我尝试过
Where t.CustomerNumber NOT IN (SELECT t2.CustomerNumber
FROM t t2
WHERE t2.blnUnexpired = 1
AND t2.CustomerNumber = t.CustomerNumber )
这确实给了我正在寻找的结果,但是我有数百万行返回,所以它在几个小时后超时,以前的方法能够在不到一个小时的时间内运行。
我的查询中有一些其他数据,提供的数据是一个小得多的版本,用于突出我的问题。
关于如何完成这项工作的任何建议?谢谢你。
解决方案
当您定义您的blnActive
和blnUnexpired
案例时,您只定义了“1”个案例,这意味着如果它不符合这些条件,它将为空。尝试添加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)
推荐阅读
- asp.net-mvc - 从下拉列表数组中获取所选项目
- typescript - Tomcat API无法从角度访问
- java - 当使用 Jackson 存在互斥字段时抛出异常的通用方法
- twitter-bootstrap - 获取隐藏的表单值并以模式显示
- jenkins - 在 Jenkins 中运行我的赛普拉斯测试时出现跨源错误
- html - 如果值为 0 或为空,如何隐藏按钮?
- azure - 资源 Skus API 返回冲突信息
- python - 如果时间是列表中的最后一个,Python会查找明天的日期
- python - 按日期对数据框进行分组,以使用 pandas 从 svm 算法中提取每日结果
- javascript - ES6在另一个类中调用方法,使用模块