【问题标题】:PLSQL or SSRS, How to select having all values in a group?PLSQL 或 SSRS,如何选择在一个组中包含所有值?
【发布时间】:2013-03-21 15:58:26
【问题描述】:

我有一张这样的桌子。

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”子句会有所帮助,但我不确定。

顺便说一下,我不知道列表中有多少参数。

非常感谢任何帮助。

【问题讨论】:

    标签: sql oracle reporting-services plsql ssrs-2008


    【解决方案1】:

    标准方法类似于

    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)
    

    这将要求您确定列表中有多少个值,以便如果有 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
    

    【讨论】:

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

      【讨论】:

      • 这也是一个有用的解决方案,但我是从 SSRS 发送参数作为列表,所以我不能单独使用 X 和 Y。并且列表中的参数数量是未知的。无论如何,谢谢。
      猜你喜欢
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多