如何查找组SQL服务器中的所有记录的值是否相同

时间:2016-02-05 02:18:29

标签: sql sql-server tsql sql-server-2012

我需要您的查询帮助。我有CustomerID及其家庭详细信息CustomerID对于家庭成员和其他家庭成员来说是相同的。并且该表包含Person ID,FirstName,LastName和MiddleName。

我想获得中间名相同的所有客户和家庭成员详细信息,当一些客户的中间名更新时,我们遇到了一个不幸。

示例数据:

create table #testcust (CustID INT, Pid INT, FName VARCHAR(3), LName VARCHAR(3), MName VARCHAR(1))

insert into #testcust

select 11111, 001, 'ABC', 'CDE', 'X'
union all
select 11111, 002, 'CDE', 'CDE', 'X'
union all
select 11111,003, 'XVC', 'CDE', 'X'
union all
select 11111, 004, 'YUS', 'CDE', 'X'
union all
select 11111, 005, 'AHS', 'CDE', 'X'
union all

select 11011, 001, 'OPO', 'ABS', 'X'
union all
select 11011, 002, 'LKJ', 'ABS', 'Y'
union all
select 11011, 003, 'FGS', 'ABS', 'X'
union all

select 21011, 001, 'OLO', 'ABX', 'Y'
union all
select 21011, 002, 'LOJ', 'ABX', 'Y'
union all

select 11031, 001, 'OPO', 'OBS', 'X'
union all
select 11031, 002, 'LKJ', 'OBS', 'Y'
union all
select 11031, 003, 'FGS', 'OBS', 'X'
union all
select 11031, 004, 'OPO', 'OBS', 'X'
union all
select 11031, 005, 'LKJ', 'OBS', 'Y'
union all
select 11031, 006, 'FGS', 'OBS', 'X'
union all

select 10000, 001, 'CDE', 'CDE', 'X'
union all
select 10000, 002, 'XVC', 'CDE', ''  
union all 
select 10000, 003, 'YUS', 'CDE', ''
union all   
select 10000, 004, 'AHS', 'CDE', 'X'

select * from #testcust

drop table #testcust

我想获得所有客户的详细信息,其中的中间名称是相同的。

2 个答案:

答案 0 :(得分:0)

只需GROUP BY CustomerID和COUNT DISTINCT中间名。然后只保留那些名为HAUNT COUNT = 1的名称。

SELECT
    CustID
    ,COUNT(DISTINCT MName) AS DistinctMiddleNames
FROM #testcust
GROUP BY CustID
HAVING COUNT(DISTINCT MName) = 1
ORDER BY CustID;

<强>结果

+--------+---------------------+
| CustID | DistinctMiddleNames |
+--------+---------------------+
|  11111 |                   1 |
|  21011 |                   1 |
+--------+---------------------+

答案 1 :(得分:0)

您可以计算每个客户ID的唯一中间名数:

SELECT  CustID ,
        COUNT(DISTINCT Pid) ,
        COUNT(DISTINCT MName)
FROM    #testcust
GROUP BY CustID 
HAVING  COUNT(DISTINCT MName) = 1

由于家庭成员可能具有相似的中间名,因此您可以通过区分大小写来改进查询:

SELECT  CustID ,
        COUNT(DISTINCT Pid) ,
        COUNT(DISTINCT MName COLLATE Latin1_General_CS_AS )
FROM    #testcust
GROUP BY CustID 
HAVING  COUNT(DISTINCT MName COLLATE Latin1_General_CS_AS ) = 1

你知道如果中间名是“X”和“x”,那么你知道他们没有使用相同的“不幸事件”进行更新。