Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL-使用“高级”在两个表之间进行比较;就好像",;_Sql Server - Fatal编程技术网

Sql server SQL-使用“高级”在两个表之间进行比较;就好像",;

Sql server SQL-使用“高级”在两个表之间进行比较;就好像",;,sql-server,Sql Server,好的,这会变得有点混乱,所以请尽量和我在一起 我有一张这样的信息表 Table Name: Customers _____________________________ ID | CompanyName | FirstName | LastName | Phone ------------------------------- 1 | Joes | Joe | James | 1233334444 2 | Kennys | Kenn

好的,这会变得有点混乱,所以请尽量和我在一起

我有一张这样的信息表

Table Name: Customers
_____________________________
ID   | CompanyName | FirstName | LastName  | Phone
-------------------------------
1    | Joes        | Joe       | James     | 1233334444
2    | Kennys      | Kenny     | Johnson   | 2222334555
3    | Kellys      | Kelly     | Gibson    | 5454445445
4    | Ricks #1    | Rick      | Lawson    | 4545334222
5    | Johns #1    | Johny B   | James     | 4545222211
6    | Johns #2    | Johny     | James     | 4545222211
7    | Johns #3    | Johny     | James     | 4545222211
8    | Ricks #2    | Rick A    | Lawson    | 4545334222
我需要知道如何创建一个SQL语句来查找所有重复记录,将它们相加,然后显示找到的第一个公司名称的重复记录总数

*这里是一个陷阱——正如你从上表中看到的,有时他们会将自己的首字母写在自己的名字上(例如,ID5和ID6是同一个人,但他将中间的首字母写在ID5中,你可以看到ID4和ID7的首字母)

我需要SQL语句将比较建立在匹配姓氏的基础上,然后对姓氏和公司名执行“类似”的操作,以确保它们按应有的方式计数

例如,我应该得到一个类似于

Table Name: TableResults
_____________________________
ID   | CompanyName | FirstName | LastName  | Phone       | Count
-------------------------------
4    | Ricks #1    | Rick      | Lawson    | 4545334222  | 2
5    | Johns #1    | Johny B   | James     | 4545222211  | 3

这可能吗?

如果可能的话,我相信名称分析将是一些非常复杂的SQL。首先,您可能希望确保名称列使用不区分大小写的排序规则,例如
utf8\u general\u ci
。我不相信人们总是把自己的名字大写。如果他们粗心的话,他们也可能有打字错误

LIKE
不够聪明,无法匹配差异较小的字符串,除非您确切知道将
%
放在何处。它不仅仅是一个通配符匹配函数

也许用算法检查一下?但这只有在所有数据都是英文的情况下才有效

电话号码是识别重复项的可靠方法吗?如果是这样,您可以跳过名称分析,只需执行以下操作:

SELECT ID, CompanyName, FirstName, LastName, Phone, COUNT(1) AS Count
FROM Customers 
GROUP BY Phone
ORDER BY ID ASC

我想你可能需要使用模糊匹配

试试这个:

WITH InitialData AS
(
  SELECT *, SOUNDEX(LastName) + SOUNDEX(CompanyName) Similarity 
    FROM Customers
), FinalData AS
(
  SELECT *, 
          ROW_NUMBER() OVER(PARTITION BY Similarity ORDER BY ID) Position,
          COUNT(1)  OVER(PARTITION BY Similarity) Count
  FROM InitialData
)
SELECT ID, CompanyName, FirstName, LastName, Phone, Count
  FROM FinalData
WHERE Position = 1
  AND Count > 1

SQLFiddle:

不,有时他们会列出不同的电话号码,所以我不能使用电话号码。在SQL中如何使用电话号码?我尝试了复制粘贴,但我只是得到了错误。我刚刚得到“无效的SQL语句”,我发布的代码是SQL。错误是什么?您使用的SQL Server的版本是什么?我在SQL 2005和Access 2007中都尝试过。两者都表示SQL语句无效。显然,我在SQL server 2005中复制的n粘贴错误。所以我想对于访问来说没有办法做到这一点?我不确定访问中是否有任何固有的模糊匹配方法。但您可以查看本文以添加一个: