[英]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
-如果一個人同時具有Y
和N
狀態,則顯示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個變量很容易。
如果您有更多變量,那么我建議您調查一下卡諾地圖
這里的另一個答案給出了一個原始的解決方案:
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.