少し間接的に:
SELECT a, b,
COUNT(DISTINCT c) AS num_c,
COUNT(DISTINCT d) AS num_d,
COUNT(DISTINCT e) AS num_e
FROM t
GROUP BY a, b;
これにより、次の結果が得られます。
1 2 1 2 1
3 2 1 1 2
num_c
またはnum_d
またはnum_e
列の値が 1 より大きい場合、さまざまな値があります。次のような CASE ステートメントを使用して、クエリを変更して、(a, b) の特定の値に対して列が変化しているかどうかを一覧表示できます。
-- v for varying, n for non-varying
SELECT a, b,
CASE WHEN COUNT(DISTINCT C) > 1 THEN 'v' ELSE 'n' END AS num_c,
CASE WHEN COUNT(DISTINCT d) > 1 THEN 'v' ELSE 'n' END AS num_d,
CASE WHEN COUNT(DISTINCT e) > 1 THEN 'v' ELSE 'n' END AS num_e
FROM t
GROUP BY a, b;
これにより、次の結果が得られます。
1 2 n v n
3 2 n n v
特定の列の値のセットが (a, b) の値に対して変化するかどうかだけを本当に知りたい場合 ((a, b) のどの値が変化するかではなく)、上記のクエリをサブとして使用できます。 - FROM 句でクエリを実行し、必要に応じて整理します。
SELECT MAX(num_c) AS num_c,
MAX(num_d) AS num_d,
MAX(num_e) AS num_e
FROM (SELECT a, b,
CASE WHEN COUNT(DISTINCT C) > 1 THEN 'v' ELSE 'n' END AS num_c,
CASE WHEN COUNT(DISTINCT d) > 1 THEN 'v' ELSE 'n' END AS num_d,
CASE WHEN COUNT(DISTINCT e) > 1 THEN 'v' ELSE 'n' END AS num_e
FROM t
GROUP BY a, b
);
v
これは、より大きいことに依存していn
ます。このバイナリ決定は十分に簡単です (そして十分に便利です) が、たとえば 4 つの状態をマッピングする場合は、必ずしも便利または簡単ではありません。
これにより、次の結果が得られます。
n v v