2014-10-22 51 views
1

我想爲以下數據獲取sql。 我有這樣如果多集表中存在'Y',則分配'Y'標誌

id | flag 
1 | Y 
2 | Y 
1 | Y 
2 | N 
1 | Y 
1 | Y 
1 | Y 
3 | N 
3 | N 
3 | N 
2 | N 
3 | N 

Expeted輸出

1 | Y 
2 | Y 
3 | N 

數據如果id列有Y和或N然後顯示Y.如果它僅包含N,則顯示n

+0

你寫這方面的任何查詢? – 2014-10-22 03:43:29

+0

是的,我做到了。選擇id,max(flag ='Y'的情況下,然後1 else 0結束)flag_value from table_name group by 1,然後我簡單地將1與Y交換,0與N交換 – user1206412 2014-10-22 04:18:30

回答

0

你只需要對該組進行分組和計數。你說如果它只包含N然後顯示N。這意味着當包含N的所有標誌等於該組中的所有元素時,則應該顯示一個N。否則,一個Y

所以你只需要進行分組並執行前面的比較。從字面上看。這樣可以在未來出現ZNULL的標誌時正確響應。

標準SQL

SELECT id, 
    CASE WHEN SUM(flag = 'N') = COUNT(*) THEN 'N' ELSE 'Y' END groupedFlag 
FROM tab GROUP BY id 

MySQL的

SELECT id, IF(SUM(flag = 'N') = COUNT(*), 'N', 'Y') groupedFlag 
FROM tab GROUP BY id 

撥弄ZNULL標誌here

+0

標準SQL寫入有錯誤嗎? 。我們可以給這樣的SUM(flag ='N')? – 2014-10-22 12:23:45

+0

沒有。這會導致一個布爾表達式,它在MySQL中變爲1或0,並且可以應用SUM函數 – 2014-10-22 12:46:09

3
SELECT [id], MAX([flag]) 
FROM Table1 GROUP BY [id] 

FIDDLE

+1

如果您不明確flag = Z'來的查詢將不再工作這個答案是不完整的 – 2014-10-22 03:56:56

+0

是的。你是對的@MostyMostacho。但是國旗專欄的一般規則是運用布爾。 – 2014-10-22 05:07:05

1

如果您的值不是YN在列中。

SELECT t1.id, IF(t2.id IS NULL,'N','Y') AS flag 
FROM tab t1 LEFT JOIN (
    SELECT DISTINCT id FROM tab 
    WHERE flag = 'Y' 
) t2 ON t1.id = t2.id GROUP BY t1.id 

否則,Praveen的答案就簡單多了。

+0

注意,如果表中包含'(4,NULL)'這將返回'N',並且它實際上不滿足條件*如果它只包含N然後顯示N * – 2014-10-22 04:23:02

+0

如果您想嚴格遵守OP的要求,你可以添加另一個子查詢連接作爲't3',但是使用'WHERE flag NOT IN('Y','N')',然後向外部查詢添加一個'WHERE t3.id IS NULL'。這將排除所有具有非「Y」或「N」標誌的行。 – Austin 2014-10-22 06:16:30

0

我試過下面的方法,它工作正常。但我不相信有我自己的query

select id, max(case when flag = 'Y' then 1 else 0 end) flag_value 
from table_name group by 1 

,然後我乾脆換1Y0N

我一直在尋找,如果我能進一步改善這一點。

0

嘗試此查詢

select id,max(flag) as flag from test group by id 
相關問題