2013-03-21 25 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

相关问题