我有8项记录如下:
ID | Common ID | Reject
-------------------------
AB-1 | AB | NULL
AB-2 | AB | YES
AB-3 | AB | NULL
BB-1 | BB | YES
BB-2 | BB | YES
BB-3 | BB | YES
CB-1 | CB | YES
CB-2 | CB | YES
DB-1 | DB | NULL我的预期结果是:
ID | Common ID | Reject
-------------------------
BB-1 | BB | YES
CB-1 | CB | YES对于所有具有相同公共ID的记录,我只希望在拒绝列为yes时获得不同的记录。
发布于 2016-05-17 09:19:41
select min(ID), [Common ID], max(Reject)
from tablename
group by [Common ID]
having count(*) = count(case when Reject = 'YES' then 1 end)如果公共ID的行数与“是”的行数相同,则返回它!
HAVING子句的count(*)返回[Common ID]的行总数。如果拒绝=是,则case表达式返回1,否则为null。右侧count返回大小写返回非空值的行数(即,当拒绝是!)当行数相同时,HAVING为真!
编辑:
在这种特殊情况下,当拒绝列的值似乎为“是”或“空”时,可以将HAVING简化为:
having count(*) = count(Reject)但是,如果以后会在列中找到其他值(如NO),则这将无法工作。所以我推荐原始的HAVING条款!
发布于 2016-05-17 09:10:50
SELECT MIN(ID), CommonID, MIN(Reject) as Reject
FROM yourtable
GROUP BY CommonID
HAVING MIN(ISNULL(Reject, '')) = MAX(ISNULL(Reject, ''))
AND MIN(ISNULL(Reject, '')) = 'Yes'编辑:由于您有空值,因此需要在列上使用ISNULL()
发布于 2016-05-17 09:12:02
在GROUP BY子句中使用带有WHERE的子查询。
SELECT ID, [Common ID], Reject
FROM yourtable
WHERE (SELECT SUM(LEN(a.Reject))
FROM yourtable a
WHERE ID = a.ID
GROUP BY a.ID) IS NULL输出:
SQL Fiddle:
https://stackoverflow.com/questions/37271683
复制相似问题