首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有当所有记录的特定列都具有一定价值时,才选择不同的记录组

只有当所有记录的特定列都具有一定价值时,才选择不同的记录组
EN

Stack Overflow用户
提问于 2016-05-17 09:04:45
回答 8查看 517关注 0票数 3

我有8项记录如下:

代码语言:javascript
复制
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

我的预期结果是:

代码语言:javascript
复制
ID   | Common ID | Reject
-------------------------
BB-1 | BB        | YES
CB-1 | CB        | YES

对于所有具有相同公共ID的记录,我只希望在拒绝列为yes时获得不同的记录。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-05-17 09:19:41

代码语言:javascript
复制
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简化为:

代码语言:javascript
复制
having count(*) = count(Reject)

但是,如果以后会在列中找到其他值(如NO),则这将无法工作。所以我推荐原始的HAVING条款!

票数 4
EN

Stack Overflow用户

发布于 2016-05-17 09:10:50

代码语言:javascript
复制
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()

票数 1
EN

Stack Overflow用户

发布于 2016-05-17 09:12:02

GROUP BY子句中使用带有WHERE的子查询。

代码语言:javascript
复制
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:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37271683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档