模糊列上的TSQL分组

模糊列上的TSQL分组,sql,sql-server,tsql,grouping,fuzzy,Sql,Sql Server,Tsql,Grouping,Fuzzy,我想从一个表中对所有商户交易进行分组,然后进行计数。问题是,商家,比如说redbox,将有一个redbox加上商店编号添加到endredbox 4562,redbox*1234。我还将包括分组目的的类别 Category Merchant restaurant bruger king 123 main st restaurant burger king 456 abc ave restaurant mc donalds * 45877d2d restaurant

我想从一个表中对所有商户交易进行分组,然后进行计数。问题是,商家,比如说redbox,将有一个redbox加上商店编号添加到endredbox 4562,redbox*1234。我还将包括分组目的的类别

Category      Merchant
restaurant    bruger king 123 main st
restaurant    burger king 456 abc ave
restaurant    mc donalds * 45877d2d
restaurant    mc 'donalds *888544d
restaurant    subway 454545
travelsubway  MTA
gas station   mc donalds gas
travel        nyc taxi
travel        nyc-taxi
问题是:如果商户添加了地址或门店位置,我如何对其进行分组。我只需要对每个商户进行计数。

您可以使用LIKE

SELECT COUNT(*) AS "COUNT", "BURGER KING" 
FROM <tables>
WHERE restaurant LIKE "%king%"

UNION ALL
SELECT COUNT(*) AS "COUNT", "JACK IN THE BOX" 
FROM <tables>
Where resturant LIKE "jack in the box%"

您可能需要根据记录的拼写方式来移动通配符。

这在一定程度上取决于您使用的数据库,但大多数数据库都有某种类型的REGEXP_INSTR或其他函数,您可以使用它们来检查模式的第一个索引。你可以这样写

SELECT SubStr(merchant, 1, REGEXP_INSTR(merchant, '[0-9]')), count('x')
  FROM Expenses
 GROUP BY SubStr(merchant, 1, REGEXP_INSTR(merchant, '[0-9]'))

这假设商户名称没有编号,而门店编号有。但是,您可能仍然需要使用替换符(如*、-)来去除任何特殊字符。

简单的回答是,没有办法准确地做到这一点,尤其是使用纯SQL

您可以找到精确的匹配,也可以使用LIKE运算符或一系列潜在的大型正则表达式查找通配符匹配,但是您无法找到类似的匹配,也无法找到匹配的潜在拼写错误

根据您正在构建的应用程序的类型,我可以想出一些可能的方法来解决这个问题

首先,规范化数据库中的商户数据。我建议不要在数据库中存储准确的、未经处理的字符串,如Bruger King。如果您遇到与已知商户集不匹配的商户,请询问用户该商户是否已与数据库中的某个商户匹配。当数据进入时,对其进行处理并将其与现有已知商户进行匹配

存储相似系数。您可能会幸运地使用类似于a的东西来判断两个字符串有多相似。也许在剔除这些数字后,这可能会相当有效。至少,它可以让你创建一个用户界面,可以尝试猜测它是什么商家。此外,一些数据库引擎具有全文索引操作符,可以描述类似或听起来类似的内容。这些可能值得调查

记住每个用户的商户匹配。如果用户将bruger king 123 main st更正为Burger king,则存储该关系并在将来记住它,而无需提示用户。这些数据还可用于帮助其他用户更正其数据


但是如果没有UI呢?也许你正在尝试做一些自动化的数据处理。我真的认为没有某种人为干预就无法处理这个问题,尽管上面描述的一些技术可以帮助实现这个过程的自动化。我还要看看你的数据来源。也许有一个独特的商户ID可以用作密钥,或者可能存在一个所有已知商户的列表,也许信用卡公司提供了这个API?如果有大量数据需要处理,另一种选择是使用类似亚马逊的服务部分自动化数据。

这与bruger king 123 main st不匹配。我需要对所有商户进行计数,而不仅仅是一个商户,就像“%king%”不起作用一样,输出需要如下所示:商户计数类别bruger king 2餐厅地铁1餐厅地铁1旅游mc donalds 2餐厅mc donalds 1gas Station SQL没有内置的正则表达式支持。