如何计算列和同一组中的不同值

时间:2017-03-07 23:17:36

标签: sql sql-server sql-server-2008 case-statement

我必须区分组中的不同值,我该如何执行? 我的表格示例:

Person  Status
1       Y
2       N
3       Y
3       N

- 如果某人只有Y状态,则显示Yes

- 如果某人只有N状态,则显示No

- 如果某人同时拥有YN状态,则会显示No

结果:

Person  Status
1       Yes
2       No
3       No

当一个人同时具有两种状态时,如何执行最后一次逻辑?这是我尝试过的有效的陈述,但我不能100%确定它是否准确:

CASE WHEN SUM(CASE WHEN Status = 'Y' THEN 1 ELSE 0 END)>=1 AND SUM(CASE WHEN Status = 'N' THEN 1 ELSE 0 END)>=1 THEN 'No' 
    WHEN SUM(CASE WHEN Status  = 'Y' THEN 1 ELSE 0 END)>=1 THEN 'Yes'
ELSE 'No'END

2 个答案:

答案 0 :(得分:1)

你可以使用MIN:

# Computation

答案 1 :(得分:0)

检查您的查询

为简单起见,我们说:

(Y) -> SUM(CASE WHEN Status = 'Y' THEN 1 ELSE 0 END)
(N) -> SUM(CASE WHEN Status = 'N' THEN 1 ELSE 0 END) 

因此您的查询可以写为伪代码:

case when (Y)>=1 and (N)>=1 then 'No'
     when (Y)>=1 then 'Yes'
     else 'No'
end

检查您的查询是否正确您需要从查询中为所有可能的输入构建一个真值表:

  (Y) | (N)      (Y)>=1 | (N)>=1      (Y)>=1 and (N)>=1      Result
 -----------    -----------------    -------------------    --------
   0  |  0        false | false             false             'No'
   0  | >=1   =>  false | true    =>        false        =>   'No'
  >=1 |  0        true  | false             false             'Yes'
  >=1 | >=1       true  | true              true              'No'

看起来就像你做对了!

创建正确的条件

确定你的病情是否正确你需要建立一个真值表:

(1)
    Yes   |    No     | Result
-------------------------------
found     | found     | No
not found | found     | No
found     | not found | Yes
not found | not found | Null

(2)
         \       No  
    Yes   \ Found | Not Found |
-------------------------------
 Found     |  No  |    Yes    |
-------------------------------
 Not Found |  No  |    Null   |
 ------------------------------

首先要注意的是,如果找到status == No,则结果始终为No。

只有当找不到No并且找到Yes时,我们才会返回Yes。

所以你的病情可以用嵌套的情况写出来。

select columns, ....
(
  case when (SUM(CASE WHEN Status = 'N' THEN 1 ELSE 0 END)>=1) then 'No'
       else case when (SUM(CASE WHEN Status = 'Y' THEN 1 ELSE 0 END)>=1) then 'Yes'
                 else NULL
            end
  end
) as result

条件中有2个变量很容易 如果您有更多变量,那么我建议您查看Karnaugh map

检查'MIN'回答

这里的另一个答案给出了原始解决方案:

select CASE WHEN MIN(status) = 'Y' THEN 'Yes' ELSE 'No' END
, Person
from table
group by Person

这是对的吗?

让我们先检查所有可能的输入。

Input:
{Y} - contains only Y in the column
{N} - contains only N in the column
{Y,N} - contains Y and N in the column
{} - Y and N do not appear in the column

让我们计算所有可能的结果:

Input        MIN(status)      Result
-------     -------------    --------
 {Y}             Y             Yes
 {N}     =>      N        =>   No
 {Y,N}           N             No
 {}             NULL           No

这是一个正确的答案。