Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为每组列标识具有不同值的列_Sql_Distinct Values - Fatal编程技术网

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

Sql 为每组列标识具有不同值的列,sql,distinct-values,Sql,Distinct Values,给定一个表,t: 什么样的SQL查询可以识别具有一个或多个不同值实例的列,这些实例与列a和b中的每个元组关联 在上面的表t中,d列和e列将满足该标准,但c列不满足 对于元组和来自列a和b的元组,列c并没有针对每个元组的不同值 列d有一个元组值变化的实例——值4和5 列e还有一个不同元组值的实例——值7和8。类似的内容应该适用于使用大小写、计数和分组方式: select a, b, case when count(distinct c) > 1 then 'yes' else 'n

给定一个表,t:

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

在上面的表t中,d列和e列将满足该标准,但c列不满足

对于元组和来自列a和b的元组,列c并没有针对每个元组的不同值

列d有一个元组值变化的实例——值4和5


列e还有一个不同元组值的实例——值7和8。

类似的内容应该适用于使用
大小写
计数
分组方式

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
稍微间接地:

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
1   2   n   v   n
3   2   n   n   v
n   v   v
如果
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   1   2   1
3   2   1   1   2
1   2   n   v   n
3   2   n   n   v
n   v   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个状态需要映射,就不一定方便或容易

这将产生:

1   2   1   2   1
3   2   1   1   2
1   2   n   v   n
3   2   n   n   v
n   v   v

您正在使用哪些RDBMS?非常感谢!最后一个问题是我需要的。