为每组列标识具有不同值的列

时间:2013-02-24 00:23:35

标签: sql distinct-values

给定一个表, t

a     b    c     d      e
1     2    3      4     7   
1     2    3      5     7
3     2    4      6     7
3     2    4      6     8

哪些SQL查询可以识别具有与列 a b 中的每个元组关联的一个或多个不同值实例的列的列,?

在上面的表 t 中,列 d e 符合此条件,但不符合 c 列。< / p>

对于元组&lt; 1,2&gt;和&lt; 3,2&gt;来自列 a b 的列, c 列的每个元组没有不同的值。

d 具有用于元组&lt; 1,2&gt;的一个不同值的实例。 - 值4和5.

e 也有一个不同值的实例,用于元组&lt; 3,2&gt; - 值7和8。

2 个答案:

答案 0 :(得分:2)

使用CASECOUNTGROUP BY这样的内容应该对您有用:

select 
  a, b,
  case when count(distinct c) > 1 then 'yes' else 'no' end colc,
  case when count(distinct d) > 1 then 'yes' else 'no' end cold,
  case when count(distinct e) > 1 then 'yes' else 'no' end cole
from t
group by a, b

SQL Fiddle Demo

答案 1 :(得分:0)

稍微间接地:

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_cnum_dnum_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