我想爲以下數據獲取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
我想爲以下數據獲取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
你只需要對該組進行分組和計數。你說如果它只包含N然後顯示N。這意味着當包含N
的所有標誌等於該組中的所有元素時,則應該顯示一個N
。否則,一個Y
。
所以你只需要進行分組並執行前面的比較。從字面上看。這樣可以在未來出現Z
或NULL
的標誌時正確響應。
標準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
撥弄Z
和NULL
標誌here。
標準SQL寫入有錯誤嗎? 。我們可以給這樣的SUM(flag ='N')? – 2014-10-22 12:23:45
沒有。這會導致一個布爾表達式,它在MySQL中變爲1或0,並且可以應用SUM函數 – 2014-10-22 12:46:09
SELECT [id], MAX([flag])
FROM Table1 GROUP BY [id]
如果您不明確flag = Z'來的查詢將不再工作這個答案是不完整的 – 2014-10-22 03:56:56
是的。你是對的@MostyMostacho。但是國旗專欄的一般規則是運用布爾。 – 2014-10-22 05:07:05
如果您的值不是Y
和N
在列中。
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的答案就簡單多了。
注意,如果表中包含'(4,NULL)'這將返回'N',並且它實際上不滿足條件*如果它只包含N然後顯示N * – 2014-10-22 04:23:02
如果您想嚴格遵守OP的要求,你可以添加另一個子查詢連接作爲't3',但是使用'WHERE flag NOT IN('Y','N')',然後向外部查詢添加一個'WHERE t3.id IS NULL'。這將排除所有具有非「Y」或「N」標誌的行。 – Austin 2014-10-22 06:16:30
我試過下面的方法,它工作正常。但我不相信有我自己的query
select id, max(case when flag = 'Y' then 1 else 0 end) flag_value
from table_name group by 1
,然後我乾脆換1
與Y
和0
與N
我一直在尋找,如果我能進一步改善這一點。
嘗試此查詢
select id,max(flag) as flag from test group by id
你寫這方面的任何查詢? – 2014-10-22 03:43:29
是的,我做到了。選擇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