2013-11-12 2 views
0

Во-первых, надейтесь, что заголовок выражает проблему. В противном случае любое предложение приветствуется. Мой вопрос я иметь следующую структуру таблицы:разделите столбец на два на основе другого значения столбца - ORACLE

+----+------+------------------+-------------+ 
| ID | Name | recipient_sender | user  | 
+----+------+------------------+-------------+ 
| 1 | A |    1 | X   | 
| 2 | B |    2 | Y   | 
| 3 | A |    2 | Z   | 
| 4 | B |    1 | U   | 
| |  |     |    | 
+----+------+------------------+-------------+

Причем в колонке recipient_sender значение 1 означает, что пользователь является получателем, значение 2 означает, что пользователь является отправителем.
мне нужно представить данные следующим образом:

+----+------+-----------+---------+ 
| ID | Name | recipient | sender | 
+----+------+-----------+---------+ 
| 1 | A | X   | Z  | 
| 2 | B | U   | Y  | 
+----+------+-----------+---------+

Я попытался автообъединение, но это не сработало. Я не могу использовать MAX с CASE WHEN, так как количество записей слишком велико.

Примечание: Пожалуйста игнорировать плохой дизайн таблицы, как это просто упрощенный пример реальных

+1

Это довольно тривиально (и реферата) проблема - это ваше домашнее задание? Что вы пробовали? В электронном письме может быть один отправитель, но может иметь несколько получателей - подходит ли это к вашему реальному набору данных? – symcbean

+0

@symcbean 1 и 2 - это всего лишь код для идентификации пользователя, если он для получателя или отправителя – Hawk

ответ

1

Пожалуйста, попробуйте:

SELECT 
    MIN(ID) ID 
    Name, 
    max(case when recipient_sender=1 then user else null end) sender, 
    max(case when recipient_sender=2 then user else null end) recipient 
From yourTable 
group by Name 
+1

То же, что и mucio'a, я выбрал 'case when' over' decode' для удобочитаемости и общности. см. [здесь] (http://stackoverflow.com/questions/3193692/case-vs-decode) и [здесь] (http://www.oratable.com/decode-case-differences/) – Hawk

0

Создать новую таблицу (с лучшей структурой):

insert into <newtable> as 
select distinct 
    id, 
    name, 
    user as recipient, 
    (select user from <tablename> where id = recip.id and name = recip.name) as sender 
from <tablename> recip 

жаль, нет оракула здесь ,

0

Вы можете выбрать значения с этим запросом

SELECT t.id, 
     t.name, 
     case 
     when t.recipient_sender = 1 then 
      t.user 
     ELSE 
      t2.user 
     END as recipient, 
     case 
     when t.recipient_sender = 2 then 
      t.user 
     ELSE 
      t2.user 
     END as sender 
    FROM your_table t 
    JOIN your_table t2 
    ON t.name = t2.name 
    AND t.id != t2.id 

после этого запроса вы можете добавить DISTINCT ключевое слово или группировать их ...

этот запрос используется для объединения таблиц с окнеИМЯстолбец, но если у вас есть некоторое тождество для сообщения, объединения таблиц с помощью этого

1

может быть, вы можете попробовать это:

select min(id) id, 
     name, 
     max(decode(recipient_sender, 1, user, '')) sender, 
     max(decode(recipient_sender, 2, user, '')) recipient 
    from t 
group by name 

Вы можете проверить демо-версию here on SQLFiddle.

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