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

Break out nested data within SQL, criteria across multiple rows (similar to dcast in R)

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

    ID  |  Col2
    X      B 
    X      C
    Y      B
    Y      D

和return这个:

    ID | Col2 | Col3
    X    B      C
    Y    B      D

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

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,即缺少 C。

I am trying to identify which IDs only have B and D. I have a query to find both

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

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;