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、少なくとも 1 つの X 値と 1 つの Y 値を持つすべての名前を検索します。同じロジックを使用すると、他の条件 (X と Y と Z、X と Y で Z は除くなど) を簡単に調整できます。外側のクエリは、名前ではなくすべての行を返すだけです。

于 2013-03-21T17:31:39.573 に答える