繁体   English   中英

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

[英]How to find if a value is same for all the records in a group SQL server

我需要你的帮助进行查询。 我有 CustomerID,他们的家庭详细信息 CustomerID 对于一家之主和其他家庭成员来说是相同的。 该表包含人员 ID、名字、姓氏和中间名。

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

样本数据:

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

我想获取所有中间名相同的所有客户的详细信息。

只需 GROUP BY CustomerID 和 COUNT DISTINCT 中间名。 然后只留下那些有 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 |
+--------+---------------------+

您可以计算每个客户 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”,那么您就知道它们没有因相同的“事故”而更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM