2013-03-14 1 views
0

Пусть Я таблицу, как это:Совокупный аналогичный ряд

NAME REF1 REF2 DRCT 
    A (null) Ra  D1 
    A  Rb (null) D1 
    A (null) Rc  D2 
    B  Rd (null) D3 
    B (null) Re  D3 

Я хочу, чтобы объединить эту таблицу в чем-то вроде:

NAME REF1 REF2 DRCT 
A  Rb  Ra  D1 
A (null) Rc  D2 
B  Rd  Re  D3 

Как вы можете видеть, я хочу объединить каждую строку же имя. Я просматриваю COALESCE и различные агрегированные функции, но я не нашел то, что искал. Есть идеи?

+0

Какие значения могут REF1 и ЗАДАНИЕ 2 взять за именем и DRCT? Следуя вашему примеру, для записей с NAME = A и DRCT = D1, REF1 может принимать только (null) или Rb, или возможно, что REF1 be, Rx? – neutrino

+0

каждое значение разрешено. Но для каждой строки определяется только один столбец. Если ref1 определен, ref2 будет null. И наоборот. –

+0

Тогда, я думаю, мой ответ будет работать на вас. Но я подумаю, что это проще. – neutrino

ответ

1

Предполагая, что я прошу в моем предыдущем комментарии верно (только нуль или заданное значение для ЗАДАНИЕ 1 и ЗАДАНИЕ 2. Для каждого имени DRCT пара), это похоже на работу:

select NAME, M_REF1, M_REF2, DRCT 
from (
    select A.NAME, coalesce(A.REF1, B.REF1) m_REF1, 
     coalesce(A.REF2, B.REF2) m_REF2, A.REF1 A_REF1, B.REF1 B_REF1, 
     A.REF2 A_REF2, B.REF2 B_REF2, A.DRCT 
    from Table1 A JOIN Table1 B on A.NAME = B.NAME AND A.DRCT = B.DRCT) 
    WHERE A_REF1 = m_REF1 AND B_REF2 = m_REF2 
UNION 
select A.NAME, A.REF1, A.REF2, A.DRCT 
FROM Table1 A JOIN 
    (select NAME, DRCT, COUNT(*) 
     from Table1 
     group by NAME, DRCT 
     HAVING COUNT(*) = 1) B ON A.NAME = B.NAME AND A.DRCT = B.DRCT; 

Профсоюз потому что строки с одной записью не включены в первый SELECT.

Но это несколько проще, и тоже работает:

select A.NAME, coalesce(A.REF1, B.REF1) M_REF1, coalesce(A.REF2,B.REF2) M_REF2,A.DRCT 
from Table1 A LEFT OUTER JOIN Table1 B ON A.DRCT = B.DRCT AND A.NAME = B.NAME 
WHERE NVL2(A.REF1,0,1) = 1 AND NVL2(B.REF1,0,1) =0 
     AND NVL2(A.REF2,0,1) = 0 AND NVL2(B.REF2,0,1) = 1 
UNION 
select A.NAME, A.REF1, A.REF2, A.DRCT 
FROM Table1 A JOIN 
(select NAME, DRCT, COUNT(*) 
    from Table1 
    group by NAME, DRCT 
    HAVING COUNT(*) = 1) B ON A.NAME = B.NAME AND A.DRCT = B.DRCT; 
+0

Я сейчас пытаюсь. Я вижу странное, где пункт, второй и третий И равны. Что вы имеете в виду? –

+0

Исправлено! И обновленный ответ. – neutrino

+0

Что делать, если мне нужно перевести аргументы с двумя столбцами на четыре столбца? Мне просто нужно добавить две пары AND в том месте где мне нужно еще два левых соединения? –

 Смежные вопросы

  • Нет связанных вопросов^_^