Oracle: объединение похожих имен вместе

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

У меня есть таблица, в которой имя запрашивающего не нормализовано. Майкл и Майкл Джек — один и тот же человек. Ларри и Ларри Ширин тоже один и тот же человек. Есть ли способ объединить данные строки, чтобы запрошенное количество и количество также правильно суммировались? Я думал, что может быть какая-то функция Oracle или аналитика, которая сделает это...

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

person Sun    schedule 15.02.2013    source источник
comment
Вместо этого их идентификатор должен был быть в этой таблице, чтобы не было никаких изменений. Вы не можете быть так уверены, что Майкл все время носит имя одного человека, это может относиться к кому-то другому... такова реальность.   -  person codingbiz    schedule 15.02.2013
comment
Мы рассматриваем возможность нормализации данных через логин или первую часть адреса электронной почты. К счастью, заказчики повторяющегося элемента, как правило, одни и те же люди, поэтому это становится менее проблемой. Спасибо за беспокойство - оно обоснованно.   -  person Sun    schedule 18.02.2013


Ответы (1)


Может быть и другой способ, но это должно работать, используя ЗАГЛАВНУЮ и сопоставляя любое имя (без пробелов) с любым полным именем (с пробелом) - если несколько полных имен совпадают, ваши результаты будут неточными.

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.

И вот результаты:

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

Я предполагаю, что у вас всего (32), потому что Ларри ошибся выше (22 + 5)?

Надеюсь это поможет.

person sgeddes    schedule 15.02.2013
comment
Могу ли я использовать верхнюю или нижнюю функцию, чтобы имена соответствовали регистру? - person Sun; 15.02.2013
comment
@SunWKim - да, конечно :) -- см. правки -- долгий день, и я думал о другом проекте. Удачи. - person sgeddes; 15.02.2013
comment
Итак, что происходит с этим запросом с теми именами, которые не содержат пробела? Исключает ли запрос эти записи? - person Sun; 25.02.2013
comment
@SunWKim - можете привести пример? Не уверен, что понял ваш вопрос? ваш вопрос был о похожих именах, а не идентичных? - person sgeddes; 01.03.2013
comment
У меня есть ситуация, когда, если имя запросчика, используемое для этого элемента, — только ДЖОН, но нет записей с ДЖОНОМ ПОСЛЕДНИМ, тогда ДЖОН не включается в набор запросов. - person Sun; 08.03.2013