sql - 使用 tSQL 计算一行中不同列的数量

标签 sql sql-server tsql

我正在为我的工作执行一项任务,不幸的是,这些表格设计得很糟糕,我无法做太多修改结构的事情(我们这里的一个主要程序多年来一直基于这些过时的表格)。话虽这么说,我需要找到一种方法来使用 SQL Server (TSQL) 来计算给定行中不同列的数量。

示例:

我有一个包含列 namefieldAfieldBfieldCfieldD等 我想返回一个包含每一行的表,返回 name 以及 fieldA - fieldD

的不同列数

视觉上:

  • 吉姆 - 1 - 3 - 4 - 6
  • 约翰福音 - 1 - 1 - 1 - 2
  • 简 2 - 2 - 3 - 3

会回来

  • 吉姆 - 4
  • 约翰 - 2
  • 简 - 2

最佳答案

实现此目的的一种方法是对数据进行逆透视,然后再次对其进行分组。这使您能够使用count(distinct):

select name, count(distinct val)
from t
unpivot (val for col in (FieldA, FieldB, FieldC, FieldD)) unpvt
group by name;

但是,最有效的方法是将所有处理保持在一行上 - 没有 joingroup byunion 。假设所有值都不为 NULL,则以下内容适用于 4 列:

select name,
       4 - ((case when FieldA in (FieldB, FieldC, FieldD) then 1 else 0 end) +
            (case when FieldB in (FieldC, FieldD) then 1 else 0 end) +
            (case when FieldC in (FieldD) then 1 else 0 end)
           )
from t;

也就是说,从列的总数开始。然后,每当一列类似于稍后出现的列时,就减去 1。最后一个条件确保重复项不会被计算多次。

关于sql - 使用 tSQL 计算一行中不同列的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17977183/

相关文章:

SQL "column ambiguously defined"- 从 hibernate 状态运行时

mysql - 编写Sql子查询

SQL Server 2005 每个月的 GROUP BY 和 COUNT 查询

c# - 在主键中创建带有 DateTime 的实体

sql - 如何替换精确的字符串

sql - sp_MSForEachDB 似乎不喜欢 GO

mysql - 对组合进行分组并计数

mysql - SQL 中的小数位

sql-server - SQL Server View 中的模拟?

sql - T-SQL 子查询和可能的连接的正确语法