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

use*_*880 6 sql t-sql sql-server

我正在为我的工作完成一项任务,不幸的是,这些表格设计得非常糟糕,而且我不能做太多修改结构(我们这里的一个主要程序已基于这些过时的表格多年).话虽这么说,我需要找到一种方法来使用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

Gor*_*off 10

一种方法是通过取消数据,然后再将其分组.这使您能够使用count(distinct):

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

但是,最有效的方法是将所有处理保持在一行 - 没有joins或group bys或unions.假设没有值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;
Run Code Online (Sandbox Code Playgroud)

也就是说,从列的总数开始.然后每当一列像后面的列时减去1 .最后一个条件确保重复项不会被计算多次.


Aar*_*and 6

DECLARE @x TABLE
(
  Name VARCHAR(32),
  A VARCHAR(32),
  B VARCHAR(32),
  C VARCHAR(32),
  D VARCHAR(32)
);

INSERT @x VALUES
('Jim', 1,3,4,6),
('John',1,1,1,2),
('Jane',2,2,3,3);

SELECT Name, NumCols = COUNT(DISTINCT x) 
FROM @x AS x
UNPIVOT (x FOR y IN (A,B,C,D)) AS up
GROUP BY Name
ORDER BY NumCols DESC; 
Run Code Online (Sandbox Code Playgroud)