3

我有一张这样的桌子。

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

但我想查看具有所有参数的名称的所有值。因此,只有 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

2 回答 2

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 个元素,则可以在子句中使用 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
于 2013-03-21T16:04:28.127 回答
2

我更喜欢将这些“集合内的集合”查询构造为一个聚合。我发现这是最灵活的方法:

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 等)。外部查询只返回所有行而不是名称。

于 2013-03-21T17:31:39.573 回答