2017-02-11 25 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;