存储在SQL server中的地址有许多小的变化(错误)

存储在SQL server中的地址有许多小的变化(错误),sql,tsql,sql-server-2000,Sql,Tsql,Sql Server 2000,我的数据库中有一个表,存储装箱单及其信息。我试图查询该表并获取每个唯一的地址。我已经接近了,但我仍然有很多未遂事件,我正在寻找一种方法,从我的选择中排除这些未遂重复 样本数据 CompanyCode CompanyName Addr1 City State Zip 10033 UNITED DIE CUTTING & FINISHIN 3610 HAMILTON AVE

我的数据库中有一个表,存储装箱单及其信息。我试图查询该表并获取每个唯一的地址。我已经接近了,但我仍然有很多未遂事件,我正在寻找一种方法,从我的选择中排除这些未遂重复

样本数据

CompanyCode   CompanyName                     Addr1                City         State   Zip
10033         UNITED DIE  CUTTING & FINISHIN  3610 HAMILTON AVE    CLEVELAND    Ohio    44114
10033         UNITED DIE CUTTING & FINISHING  3610 HAMILTON AVE    CLEVELAND    Ohio    44114
10033         UNITED DIE CUTTING & FINISHING  3610 HAMILTON AVE.   CLEVELAND    Ohio    44114
10033         UNITED DIE CUTTING & FINISHING  3610 HAMILTON AVENUE CLEVELAND    Ohio    44114
10033         UNITED DIECUTTING & FINISHING   3610 HAMILTON AVE    CLEVELAND    Ohio    44144
10033         UNITED FINISHING                3610 HAMILTON AVE    CLEVLAND     Ohio    44114
10033         UNITED FINISHING & DIE CUTTING  3610 HAMILTON AVE    CLEVELAND    Ohio    44114
我只想要一张唱片。有什么办法可以让我得到平均记录吗?也就是说,如果大多数记录都是克利夫兰而不是克莱夫兰,我希望我的1号记录是克利夫兰。有没有办法把这些数据与我所寻找的相匹配? 期望输出

 CompanyCode   CompanyName                     Addr1                City         State   Zip
 10033         UNITED DIE CUTTING & FINISHING  3610 HAMILTON AVE    CLEVELAND    Ohio    44114

你会挣扎的。我个人认为,我会考虑一个过程,试图更新数据库中的数据并改正它。

您可以更改输入数据的系统,或者如果不可能,可以使用一个外部进程在数据进入数据库后运行,该进程执行以下操作:

对照已知的列表,如城镇/州/国家等,以发现拼写错误。 查找已知的常规错误和缩写。例如Avenue/Ave.或Street/St.并将值标准化。 更改输入系统以进行此类验证和/或为用户提供地址搜索/验证UI,允许用户搜索给定某些已知值的地址(邮编等)。根据您在世界上的位置,您可以从不同的供应商处购买类似的数据。
如果这一切都起作用,我怀疑你会得到100%的回报,除非你提供了一种机制,将那些无法自动更正的内容标记为人工干预,那么你的报告就像SELECT DISTINCT一样简单…

你需要在SELECT语句中使用子查询 请尝试以下查询:

 select CompanyCode,
    (select top 1 CompanyName from Table1 where CompanyCode=X.CompanyCode 
     group by CompanyName order by count(*) desc) CompanyName,
    (select top 1 Addr1 from Table1 where CompanyCode=X.CompanyCode 
     group by Addr1 order by count(*) desc) Addr1,
    (select top 1 City from Table1 where CompanyCode=X.CompanyCode 
     group by City order by count(*) desc) City,
    (select top 1 State from Table1 where CompanyCode=X.CompanyCode 
     group by State order by count(*) desc) State,
    (select top 1 Zip from Table1 where CompanyCode=X.CompanyCode 
     group by Zip order by count(*) desc) Zip
from    Table1 X
group by CompanyCode

我希望是一次性的工作吧?除非您能用SQL术语解释为什么第一条记录是您所需要的,否则这是不可能的。作为一个临时的解决方案,我建议以下问题

select C1.* from Company C1, 
(select CompanyCode, min(CompanyName) as CompanyNameSelected 
   from Company
   group by CompanyCode) C2
where 
   C1.CompanyCode = C2.CompanyCode and 
   C1.CompanyName = C2.CompanyNameSelected;

当然,您可以使用任何聚合函数而不是返回公司名称,甚至可以编写自己的存储函数,但唯一需要做的是——您必须用查询语言解释为什么记录1比记录2好。

在StackOverflow中格式化表的最佳方法是什么?是否有一些SQL函数,如单词的统计模式?i、 e.返回字段最常用值的内容?您可以对每列执行groupby以获取最常用值,但这不会有帮助,因为它不是给定地址的最常用值,这将是有史以来输入的最常见的地址。@Neil Barnwell-如果我首先执行子查询或将以前的查询存储在临时表中,我可以使它成为子集中使用最多的地址。事实上,这是可行的。我可能不得不在运行时使用动态SQL和循环来构建我的查询,但如果结构正确,它就可以工作。只要您将它与之进行比较的值是已知的良好值,它就可以工作。我现在的感觉是:这里有龙。这不是一个容易解决的问题。嗯,我不能直接修改数据。但我想我可以将数据保存到一个临时表中,然后修改它。我该如何处理数字2?对于选项2,您将有效地执行替换样式代码,在数据到达数据库之前,用已知值替换变量,即St,St all替换为Street,或者使用某种计划/消息驱动的流程,在表已经进入后更新表,这很糟糕。所以您没有看到仅在SQL中执行此操作的方法吗?您可以使用插入触发器,但您必须提高效率,否则插入速度会降慢。如果您仅限于在数据库中执行此操作,我会在表上插入触发器,将消息写入另一个表;如果您使用SQL Server运行存储过程来修复与每条消息相关的数据并删除消息,则会使用SQL代理执行单独的计划进程。我讨厌这个解决方案,我们总是在工作中这样做,因为我更喜欢编写C代码,并将我的业务逻辑保留在数据库之外,但当需要时…有一些商业批处理工具将使用USPS标准化您的地址。如果第一条记录是一个打字错误或者公司代码输入错误怎么办?请注意,它不是表中的第一条记录,而是按变量分组并按count*desc排序的第一条记录。这样,在每种情况下,它都是该变量的最常用值。是的,它假设公司代码输入正确。好吧,我不明白。这可能会有帮助,我会尽快尝试。这张唱片应该有多少张?你完美地回答了我的问题。当然,我没有问这个问题,我只是意识到了一些细节,所以我仍然在寻找解决实际问题的方法。这里有更多的问题:每个公司代码可能有超过1个合法地址。我只想过滤掉那些几乎相同的。