2013-03-21 58 views
3

我有一張這樣的桌子。PLSQL或SSRS,如何選擇組中的所有值?

ID NAME VALUE 
______________ 
1 A X 
2 A Y 
3 A Z 
4 B X 
5 B Y 
6 C X 
7 C Z 
8 D Z 
9 E X 

和查詢:

SELECT * FROM TABLE1 T WHERE T.VALUE IN (X,Z) 

該查詢給了我

ID NAME VALUE 
______________ 
1 A X 
3 A Z 
4 B X 
6 C X 
7 C Z 
8 D Z 
9 E X 

但我想看看裏面有所有PARAMS名稱的所有值。 因此,只有A和C的X和Z值,和我期望的結果是:

ID NAME VALUE 
______________ 
1 A X 
2 A Y 
3 A Z 
6 C X 
7 C Z 

我怎樣才能得到想要的結果?無論是與SQL或報告服務。也許「GROUP BY ..... HAVING」條款將有所幫助,但我不確定。

順便說一句,我不知道列表中有多少個參數。

我真的很感謝任何幫助。

回答

4

標準的做法是像

SELECT id, name, value 
    FROM table1 a 
WHERE name IN (SELECT name 
        FROM table1 b 
       WHERE b.value in (x,y) 
       GROUP BY name 
       HAVING COUNT(distinct value) = 2) 

這就需要你確定有多少值是在列表中,這樣就可以在HAVING子句中使用2,如果有兩個元素,一個5如果有5個元素,等你也可以使用分析功能

SELECT id, name, value 
    FROM (SELECT id, 
       name, 
       value, 
       count(distinct value) over (partition by name) cnt 
      FROM table1 t1 
     WHERE t1.value in (x,y)) 
WHERE cnt = 2 
+0

謝謝,我試過第一個選項,它對我來說工作得很好。 – Yetik 2013-03-22 09:02:45

2

我寧願查詢作爲aggregatino的「套中套」組織這些。我覺得這是最靈活的方法:

select t.* 
from t 
where t.name in (select name 
       from t 
       group by name 
       having sum(case when value = 'X' then 1 else 0 end) > 0 and 
         sum9case when value = 'Y' then 1 else 0 end) > 0 
       ) 

in子查詢發現,至少有一個X值和一個Y值的所有名稱。使用相同的邏輯,很容易調整其他條件(X和Y和Z,X和Y但不是Z等)。外部查詢只是返回所有行而不是名稱。

+0

這也是一個有用的解決方案,但我從SSRS發送參數作爲列表,所以我不能單獨使用X和Y.列表中的參數數量未知。不管怎麼說,還是要謝謝你。 – Yetik 2013-03-22 09:04:21

相關問題