2017-02-11 61 views
1

不确定标题是否有意义。如何选择具有多个条件的行

但是,这正是我需要的,我坏在SQL:

我有表具有以下数据

ID| Value 
------ | ------ 
1| A 
1| B 
1| C 
1| D 
2| A 
2| B 
2| C 

我需要O/P为

2 A 
2 B 
2 C 

使用选择ID (A,B,C)和不在(D) 中的值给出了o/p,因为

1 A 
1 B 
1 C 
2 A 
2 B 
2 C 

需要选择标识的具有A,B,C,但不是D.

回答

0

如果你想拥有一个或A,B,C更多的价值,而不是d行:

select * 
from your_table 
where value in ('A', 'B', 'C') 
    and id not in (
     select id 
     from your_table 
     where value = 'D' 
     ); 

如果你想所有的三个值A,B,C必须存在该ID和而不D.

select id, 
    value 
from (
    select t.*, 
     count(distinct value) over (partition by id) n 
    from your_table t 
    where value in ('A', 'B', 'C') 
     and id not in (
      select id 
      from your_table 
      where value = 'D' 
      ) 
    ) 
where n = 3; 

如果你想获得具有行只有A,B,C(和他们所有的公关ESENT),然后使用:

select id, 
    value 
from (
    select t.*, 
     count(case 
       when value not in ('A', 'B', 'C') 
        then 1 
       end) over (partition by id) n, 
     count(distinct case 
       when value in ('A', 'B', 'C') 
        then value 
       end) over (partition by id) n2 
    from your_table t 
    ) 
where n = 0 
    and n2 = 3; 
+0

谢谢:)第二种解决方案是什么,我一直在寻找。万分感谢! –

-1
select id, value 
from my_table 
where value in ('A','B','C') 
and id = 2 
0

可以使用条件聚集在HAVING条款跨行过滤每个id

SELECT id 
FROM table1 
GROUP BY id 
HAVING MAX(CASE WHEN value = 'A' THEN 1 ELSE 0 END) = 1 
    AND MAX(CASE WHEN value = 'B' THEN 1 ELSE 0 END) = 1 
    AND MAX(CASE WHEN value = 'C' THEN 1 ELSE 0 END) = 1 
    AND MAX(CASE WHEN value = 'D' THEN 1 ELSE 0 END) = 0 

这将显示您这id值符合您的标准,如果你需要你可以把它放进一个子查询,并将其加入到你的表以获取所有的行,即id

SELECT a.* 
FROM table1 a 
JOIN ( SELECT id 
      FROM table1 
      GROUP BY id 
      HAVING MAX(CASE WHEN value = 'A' THEN 1 ELSE 0 END) = 1 
      AND MAX(CASE WHEN value = 'B' THEN 1 ELSE 0 END) = 1 
      AND MAX(CASE WHEN value = 'C' THEN 1 ELSE 0 END) = 1 
      AND MAX(CASE WHEN value = 'D' THEN 1 ELSE 0 END) = 0 
    ) b 
ON a.id = b.id 
0

从你的问题,我明白,要找到Value列的值,其中值为A, B, C,但Value不等于D。然后简单地将这3个值放在IN运算符中。我将在没有D的情况下检索结果集。

查询

SELECT COUNT(Value) count, Value 
FROM your_table_name 
WHERE Value in ('A', 'B', 'C') 
GROUP BY Value; 
相关问题