打破SQL中的嵌套数据,跨多行执行条件(类似于R中的dcast)

打破SQL中的嵌套数据,跨多行执行条件(类似于R中的dcast),sql,pivot,varchar,self-join,Sql,Pivot,Varchar,Self Join,我正在尝试编写一个简单的查询,以获取如下所示的数据集: ID | Col2 X B X C Y B Y D 并将此返回: ID | Col2 | Col3 X B C Y B D 本质上,我有一个ID列,在Col2中可以有B、C或D。我试图确定哪些ID只有B和D。我有一个查询来查找这两个ID,但不仅仅是这两个ID的组合。查询: select ID,

我正在尝试编写一个简单的查询,以获取如下所示的数据集:

    ID  |  Col2
    X      B 
    X      C
    Y      B
    Y      D

并将此返回:

    ID | Col2 | Col3
    X    B      C
    Y    B      D

本质上,我有一个ID列,在Col2中可以有B、C或D。我试图确定哪些ID只有B和D。我有一个查询来查找这两个ID,但不仅仅是这两个ID的组合。查询:

select ID, Col2
from Table1
where ID in (
  select ID from Table1
  group by ID
  having count(distinct Col2) = 2) 
order by ID
或者,我可以使用帮助找到一种方法来过滤B和D上的查询,而不使用B和C。我可能见过一个自连接,但不确定如何实现它

谢谢

编辑:对于给定的ID,大多数数据集都有B、C和D三个ID。这里的目标是隔离缺少一个ID的ID,即缺少C的ID

我试图确定哪些ID只有B和D。我有一个查询来查找这两个ID

如果这是您想要的,则不需要多个列:

select id
from table1
where col2 in ('B', 'D')
group by id
having count(distinct col2) = 2;
如果您只需要
'B'
'D'
而不需要其他,则:

select id
from table1
group by id
having sum(case when col2 = 'B' then 1 else 0 end) > 0 AND
       sum(case when col2 = 'C' then 1 else 0 end) > 0 AND
       sum(case when col2 not in ('B', 'D') then 1 else 0 end) = 0;
如果只有两列,还可以使用聚合轻松地透视值:

select id, min(col2), nullif(max(col2), min(col2))
from table1
group by id;

听起来你应该调查一下。你可以在里面过滤你的结果。我会编辑我的帖子,因为我没有澄清一些事情。以一个ID为例,比如X。在X下有B、C和D的实例。不仅仅是B&C或B&D。我尝试了你在那里拥有的东西,但仍然没有得到我想要的,因为当我查看在“WHERE ID=[该查询的结果]”上过滤的整个数据集时,我仍然会得到B、C的记录,D.MIN/MAX函数对varchar列有什么作用吗?@etotheeyepi。我在答案中添加了另一个选项。不幸的是没有。我仍然在用这种新方法获得包含所有三个B、C和D的ID。@etotheeyepi。我遗漏了一个条件,就是这样!非常感谢你的帮助。