如果多集表中存在'Y',则分配'Y'标志

时间:2014-10-22 03:40:46

标签: sql

我正在尝试获取以下数据的sql。 我有像

这样的数据
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

成功输出

1 | Y
2 | Y
3 | N

如果id列有Y和或N则显示Y.如果它只包含N,则显示N

5 个答案:

答案 0 :(得分:3)

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

FIDDLE

答案 1 :(得分: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的回答要简单得多。

答案 2 :(得分: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

答案 3 :(得分:0)

我试过下面的方法它工作得很好。但我不相信我自己的query

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

然后我只是将1Y0交换为N

我在想我是否可以进一步改善这一点。

答案 4 :(得分:0)

尝试此查询

 select id,max(flag) as flag from test group by id