首页 > 解决方案 > 在 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  ) 

这确实给了我正在寻找的结果,但是我有数百万行返回,所以它在几个小时后超时,以前的方法能够在不到一个小时的时间内运行。

我的查询中有一些其他数据,提供的数据是一个小得多的版本,用于突出我的问题。

关于如何完成这项工作的任何建议?谢谢你。

标签: sqloracleaggregateboolean-logic

解决方案


当您定义您的blnActiveblnUnexpired案例时,您只定义了“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) 

推荐阅读