簡體   English   中英

如何計算同一列和同一組中的不同值

[英]How to count different values in a column and same group

我必須在一個組中區分不同的值,我該如何執行? 我的桌子的例子:

Person  Status
1       Y
2       N
3       Y
3       N

-如果一個人只有Y狀態,則顯示Yes

-如果一個人只有N狀態,則顯示No

-如果一個人同時具有YN狀態,則顯示No

結果:

Person  Status
1       Yes
2       No
3       No

當一個人同時具有兩種身份時,我該如何執行最后的邏輯? 這是我嘗試過的有效語句,但我不確定是否准確:

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

您可以使用MIN:

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

檢查您的查詢

為了簡單起見,我們說:

(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。

僅當找不到“否”且找到“是”時,我們才返回“是”。

因此,您的條件可以用嵌套的情況寫。

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個變量很容易。
如果您有更多變量,那么我建議您調查一下卡諾地圖

檢查“ 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

這是正確的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM