SQL 服务器 - 如何计算多列中不同条目的数量?

SQL Server - How to count number of distinct entries across multiple columns?

我有一个 table 类似于:

FORM_NUM         DOB_1           DOB_2            DOB_3
1                06Jul1973                        20Jan1994
1                06Jul1973       12Mar1980        20Jan1994
2                17Oct1960       12Dec1996        12Dec1996
2                18Feb2000
2                17Oct1960       17Oct1960

我想计算每个表单有多少个不同的生日。您可以将每一行视为表单的一个子集。在此示例中,表格 1 有 3 个不同的生日,表格 2 有 3 个不同的生日。

我知道计算每列不同条目数的代码是 COUNT(DISTINCT ...),但有时同一个生日位于多个列中,因此简单地对每一列的不同计数求和是行不通的。

我希望输出如下所示:

FORM_NUM      COUNT
1             3
2             3

完成此任务的最佳方法是什么?

编辑:有效。代码是这样的...

SELECT FORM_NUM, COUNT(DOB) FROM  

(SELECT FORM_NUM, DOB_1 as DOB FROM table WHERE LEN(DOB_1) > 0
UNION
SELECT FORM_NUM, DOB_2 as DOB FROM table  WHERE LEN(DOB_2) > 0
UNION
SELECT FORM_NUM, DOB_3 as DOB FROM table WHERE LEN(DOB_3) > 0
UNION
SELECT FORM_NUM, DOB_4 as DOB FROM table WHERE LEN(DOB_4) > 0
UNION
SELECT FORM_NUM, DOB_5 as DOB FROM table WHERE LEN(DOB_5) > 0)TMP


GROUP BY FORM_NUM

您可以执行以下操作:

select FORM_NUM, count(DOB) from (
   select FORM_NUM, DOB_1 as DOB from table where DOB_1 is not null
   union
   select FORM_NUM, DOB_2 as DOB from table where DOB_2 is not null
   union
   select FORM_NUM, DOB_3 as DOB from table where DOB_3 is not null
) TMP
GROUP BY FORM_NUM

这将 select 每个字段分开,并集将删除重复值

SELECT FORM_NUM, COUNT(DOB) COUNT FROM

(SELECT FORM_NUM, DOB_1 DOB FROM YOURTABLE
UNION
SELECT FORM_NUM, DOB_2 DOB FROM YOURTABLE
UNION
SELECT FORM_NUM, DOB_3 DOB  FROM YOURTABLE) A GROUP BY FORM_NUM