如何找到社会安全号码后四位数相同的所有记录?

时间:2013-02-18 04:17:55

标签: sql sql-server sql-server-2008

我在一所大学工作,我获得了一项任务,可以对开发人员所做的更改的逻辑进行一些测试。

我需要什么: 我需要一个查看Persons表的SQL Server查询,并查找具有相同社会安全号码后四位数的记录。除此之外,我还想看看这些记录(SSN的最后四位数字是否相同)也具有相同的姓氏。

这是我到目前为止所得到的:
- 我对SQL很陌生,所以我很难弄清楚如何只比较SSN的后四位数,同时找到SSN和姓氏相同的最后四位数字的学生。

SELECT t1.PersonsID, 
   t1.LastName, 
   t1.GovernmentID, 
   t2.PersonsID, 
   t2.LastName, 
   t2.GovernmentID
FROM Persons t1, Persons t2
WHERE t1.GovernmentID = t2.GovernmentID
AND t1.PersonsID <> t2.PersonsID

任何帮助都将不胜感激。

谢谢!

在看了乔说我做了另一次尝试之后:

  SELECT
  t1.cmn_personsID,
  t1.governmentID,
  t1.lastname,
  t2.cmn_personsID,
  t2.governmentID,
  t2.lastname,
  case when t1.LastName = t2.lastName then 1 else 0 end as SameLastName
  from
  CMN_Persons t1, cmn_persons t2 
  WHERE right(t1.GovernmentID, 4) = right(t2.GovernmentID, 4) 
  AND t1.cmn_PersonsID <> t2.cmn_PersonsID

这件事现在已经运行了五分钟。当我尝试使用前10名时,似乎没有给我的用户使用相同的政府ID的最后四位数字,并且具有相同的姓氏。

2 个答案:

答案 0 :(得分:1)

GovernmentID是数字?如果是这样,则模数将起作用。

SELECT t1.PersonsID, 
   t1.LastName, 
   t1.GovernmentID, 
   t2.PersonsID, 
   t2.LastName, 
   t2.GovernmentID,
   case when t1.LastName = t2.lastName then 1 else 0 end as SameLastName
FROM Persons t1, Persons t2
WHERE t1.GovernmentID % 10000 = t2.GovernmentID % 10000
AND t1.PersonsID <> t2.PersonsID

要回答第2部分,您可以添加标记。

答案 1 :(得分:0)

尝试使用GROUP BY和HAVING这样。

SELECT 
Z.PersonID,
Z.Last4,
Z.Cnt
LastName = (SELECT LastName FROM Persons WHERE PersonID = Z.PersonID) 
FROM 
( 
    SELECT t1.PersonsID, 
    t1.GovermentID % 10000 as Last4, 
    COUNT(*) as Cnt
    FROM Persons t1
    GROUP BY t1.GovermentID % 10000, PersonID
    HAVING COUNT(*) > 1
) Z
ORDER BY Last4