2013-02-15 3 views
0
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 или аналитической, что бы это сделать ...Oracle: Объединение подобных имен вместе

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

Их идентификатор должен был быть в этой таблице вместо этого, таким образом не было бы никаких изменений. Вы не можете быть настолько уверены, что это один человек, который все время несет Майкла, он может относиться к кому-то еще ... это реальность. – codingbiz

+0

Мы изучаем нормализацию данных через loginid или первую часть адреса электронной почты. К счастью, реквестер для повторяющегося элемента, как правило, является одним и тем же человеком, поэтому это становится проблемой. Спасибо за вашу заботу - это действительно. – Sun

ответ

1

Там может быть другим, но это должно работать, используя UPPER и соответствие любого ПгвЬЫата (без пробелов) любого FULLNAME (с пробелом) - если несколько полных имен совпадают, результаты будут неточными.

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)?

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

+0

Могу ли я использовать верхнюю или нижнюю функцию, чтобы сделать имена последовательными? – Sun

+0

@SunWKim - да, конечно :) - см. Правки - долгий день и думал о другом проекте. Удачи. – sgeddes

+0

Ничего себе, это работает! Удивительно, спасибо. – Sun