从id中选择表group,其中该组中的所有记录都有一个flag = false

时间:2015-01-19 10:30:29

标签: sql sql-server

我的表:

ID|Col1|Col2|
1 |abc |1   |
2 |abc |0   |
3 |xyz |0   |
4 |xyz |0   |
5 |jkl |1   |

Q1。我想返回按Col1分组的记录列表,其中该组中的所有记录都有Col2 = 0.我不介意它是否返回所有记录(记录3 4)或只是唯一的(例如'xyz')。

Q2。我还希望获得按Col1分组的记录列表,其中该组中的任何记录都有Col2 = 1(在本例中为'abc'和'jkl')< / p>

5 个答案:

答案 0 :(得分:2)

select col1
from your_table
group by col1
having sum(case when col2 = 1 then 1 else 0 end) = 0

select col1
from your_table
group by col1
having sum(case when col2 = 1 then 1 else 0 end) > 0

答案 1 :(得分:1)

另一种方法,使用EXISTS和子查询:

select *
from your_table
where not exists (select * from your_table t2 where col1 = t2.col1 and col2 <> 0)

select *
from your_table
where exists (select * from your_table t2 where col1 = t2.col1 and col2 = 1)

答案 2 :(得分:0)

这可能有助于你

  declare @t table(a char(1), b int)
 insert into  @t values ('a',0),('b',1),('a',0),('b',0) 

第一次

 select distinct * from @t
 where a not in (select a from @t where b=1)

第二次

  select distinct * from @t
  where a in (select a from @t where b=1)

投票,如果它可以帮助你

答案 3 :(得分:0)

尝试条件聚合:

DECLARE @table TABLE(ID INT, Col1 VARCHAR(30), Col2 INT)
INSERT INTO @table VALUES
(1,'abc',1),
(2,'abc',0),
(3,'xyz',0),
(4,'xyz',0),
(5,'jkl',1)


SELECT Col1
FROM   @table
GROUP  BY Col1
HAVING SUM(CASE
             WHEN Col2 = 0 THEN 1
             ELSE 0
           END) = COUNT(*)

SELECT Col1
FROM   @table
GROUP  BY Col1
HAVING SUM(CASE
             WHEN Col2 = 1 THEN 1
             ELSE 0
           END) > 0 

答案 4 :(得分:0)

你已经标记了另一个答案,但你甚至可以调整它,因为在这种特殊情况下你不需要有having子句的情况。实际上,当col2不是数字类型时,你需要一些案例,比如varchar

Select col1 from table
group by col1
having sum(col2)=0

Select col1 from table
group by col1
having sum(col2)>0