我正在为我的工作执行一项任务,不幸的是,这些表格设计得很糟糕,我无法做太多修改结构的事情(我们这里的一个主要程序多年来一直基于这些过时的表格)。话虽这么说,我需要找到一种方法来使用 SQL Server (TSQL) 来计算给定行中不同列的数量。
示例:
我有一个包含列 name
、fieldA
、fieldB
、fieldC
、fieldD
等
我想返回一个包含每一行的表,返回 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;
但是,最有效的方法是将所有处理保持在一行上 - 没有 join
或 group by
或 union
。假设所有值都不为 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/