【问题标题】:Oracle: Combining similar names togetherOracle:将相似的名称组合在一起
【发布时间】:2013-02-15 13:30:14
【问题描述】:
ItemNo  Name      Requested Qty
850045  MICHAEL         46  1045
850045  MICHAEL JACKSON 38  834
850045  LARRY SHEARIN   22  473
850045  Michael Jackson 11  233
850045  Larry           5   84

我有一个请求者名称未标准化的表。迈克尔和迈克尔杰克是同一个人。拉里和拉里·希林也是同一个人。有没有办法组合行数据,以便 Requested 和 Qty 也正确总结?我在想可能有某种 Oracle 函数或分析可以做到这一点......

ItemNo  Name      Requested Qty
850045  MICHAEL JACKSON 95  2112
850045  LARRY SHEARIN   27  557

【问题讨论】:

  • 他们的 ID 应该在那个表中,这样就不会有变化。你不能这么肯定它是一个人一直怀着迈克尔,它可能指的是其他人……这就是现实
  • 我们正在研究通过登录 ID 或电子邮件地址的第一部分来规范化数据。幸运的是,经常性项目的请求者往往是同一个人,因此这不再是一个问题。感谢您的关注——这是有效的。

标签: sql oracle normalization


【解决方案1】:

可能还有另一种方法,但这应该使用 UPPER 并将任何名字(不带空格)与任何全名(带空格)匹配 - 如果多个全名匹配,则结果将不准确。

SELECT T.ItemNo, 
  T.Name, 
  T.Requested + T2.Requested Requested,
  T.Qty + T2.Qty Qty
FROM (
    SELECT ItemNo, UPPER(Name) as Name, SUM(Requested) Requested, SUM(Qty) Qty
    FROM YourTable
    WHERE Name LIKE '% %'
    GROUP BY ItemNo, UPPER(Name)
  ) T
  JOIN (
    SELECT ItemNo, UPPER(Name) as Name, SUM(Requested) Requested, SUM(Qty) Qty
    FROM YourTable
    WHERE Name NOT LIKE '% %'
    GROUP BY ItemNo, UPPER(Name)
  ) T2 ON T.ItemNo = T2.ItemNo AND T.Name LIKE T2.Name||' %' 

这里是SQL Fiddle

结果如下:

ITEMNO  NAME            REQUESTED  QTY
850045  MICHAEL JACKSON 95         2112
850045  LARRY SHEARIN   27         557

我假设你的总数是 (32),因为拉里在 (22 + 5) 上面是错误的?

希望这会有所帮助。

【讨论】:

  • 我可以使用upper或lower函数来使名称大小写一致吗?
  • @SunWKim - 是的,当然 :) -- 查看编辑 -- 漫长的一天,正在考虑另一个项目。祝你好运。
  • 那么,对于这个查询,那些不包含空格的名称会发生​​什么?查询是否排除了这些记录?
  • @SunWKim -- 你能举个例子吗?不确定我是否理解您的问题?你的问题是关于相似的名字,而不是相同的名字?
  • 我有一种情况,如果用于该项目的请求者名称仅为 JOHN,但没有 JOHN LAST 的记录,则查询集中不包含 JOHN。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2018-07-27
  • 2021-03-06
  • 2012-12-14
相关资源
最近更新 更多