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
我有一个 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