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

Имам таблица, в която името на заявителя не е нормализирано. Майкъл и Майкъл Джек са едно и също лице. Лари и Лари Ширин също са едно и също лице. Има ли начин да се комбинират данни от редове, така че Requested и Qty също да се сумират правилно? Мислех си, че може да има някаква функция или анализ на 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
Разглеждаме нормализиране на данните чрез loginid или първата част от имейл адреса. За щастие заявителите за повтарящ се елемент обикновено са едни и същи хора, така че това става по-малко проблем. Благодаря за загрижеността ви - тя е основателна.   -  person Sun    schedule 18.02.2013


Отговори (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)?

Надявам се това да помогне.

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
Имам ситуация, при която ако името на заявителя, използвано за този елемент, е само JOHN, но няма записи с JOHN LAST, тогава JOHN не е включен в набора от заявки. - person Sun; 08.03.2013