2014-08-27 3 views
0

Мне нужно крутить вокруг столбца, но он должен зависеть от другого столбца.Транспонирование через столбец db на основе других столбцов

G_ID COL_ONE COL_TWO COL_THREE  
146157 228830 null  228828 
146157 228831 228830 228863 

У меня есть G_ID, который является постоянным по пути, который я хочу развернуть. Я хочу показать

G_ID COL_THREE_1 COL_THREE_2 
146157 228863   228828   

Теперь бизнес-правила здесь, где он получает удовольствие, и мне нужны некоторые указатели.

  • Я должен прочитать COL_TWO, когда он не является нулевым. (Первый 228830)
  • Показать COL_THREE в этой строке в COL_THREE_1 как выход (228863)
  • Считать значение COL_TWO, а затем карту, что COL_ONE на другую строку, а затем выводит COL_THREE в этой строке, чтобы COL_THREE_2 (228828)

В этом примере я только показывает один G_ID, но есть много, поэтому мне нужно что-то, что будет работать над несколькими G_IDs

Все указатели на это. Ive найти это немного вызов так рад, чтобы идти, но просто нужны некоторые указатели о том, где начать

Благодарности

+0

Мне очень жаль, но я много ваших требований (не понимаю TWO_ID, ONE_ID и т. Д.), Я нахожу это довольно неясным. Не могли бы вы добавить конкретные примеры? – Emmanuel

+0

конечно. Я только что обновился. Числа, которые я использую, являются действительными числами – RNJ

ответ

1

Для этого требования, я думаю автообъединение будет достаточно:

with tab (G_ID,COL_ONE,COL_TWO,COL_THREE) as ( 
    select 146157,228830,null,228828 from dual union all 
    select 146157,228831,228830,228863 from dual union all 
    select 146158,228831,null,228829 from dual union all 
    select 146158,228832,228831,228864 from dual) 
-------------------------- 
-- End if Data preparation 
-------------------------- 
select a.g_id, b.col_three col_three_1, a.col_three col_three_2 
    from tab a 
    join tab b on a.COL_ONE = b.COL_TWO and a.G_ID = b.G_ID 
where b.col_two is not null; 

Выход:

| G_ID | COL_THREE_1 | COL_THREE_2 | 
|--------|-------------|-------------| 
| 146157 |  228863 |  228828 | 
| 146158 |  228864 |  228829 | 
+0

Спасибо! Я забыл о себе – RNJ

1

Вот попробовать только с помощью агрегатных функций (я не мог понять, как это сделать это, используя pivot пункт):

select t.g_id, 
     min(t.val_three) keep (dense_rank first order by t.val_two) VAL_THREE_1, 
     max(t.val_three) keep (dense_rank last order by t.val_two) VAL_THREE_2 
from my_table t 
group by t.g_id 
; 

Я добавил несколько значений my_table, чтобы дать лучшее представление:

G_ID VAL_ONE VAL_TWO VAL_THREE  
146157 228830 null  228828 
146157 228831 228830 228863 
146234 228832 null  228567 
146234 228833 228835 228789 

Я тогда г и др:

G_ID VAL_THREE_1 VAL_THREE_2 
1 146157 228863  228828 
2 146234 228789  228567 
Смежные вопросы