Необходимо преобразовать строки в столбцы для одинаковых идентификаторов в Oracle - PullRequest
0 голосов
/ 10 апреля 2010

Мне нужно преобразовать строки в столбцы для одинаковых идентификаторов в Oracle

например. Ниже приведен результат, который я получу, если запросю свою базу данных

Col1    Col2      Col3 
----    ----      ----
1        ABC       Yes
1        XYZ       NO
2        ABC       NO

Мне нужно преобразовать это в

Col1    Col2    Col3       Col4        Col5
----    ----    ----       ----        ----
1        ABC     Yes        XYZ          No
2        ABC     NO        NULL        NULL

Кто-нибудь, пожалуйста, помогите мне в решении этой проблемы

Спасибо, Сив

Ответы [ 2 ]

0 голосов
/ 10 апреля 2010

Одним из решений является использование предложения 10g MODEL :

SQL> select col1
  2         , col2
  3         , col3
  4         , col4
  5         , col5
  6  from   t23
  7  model
  8    return updated rows
  9    partition by ( col1 )
 10    dimension by ( row_number() over ( partition by col1
 11                                       order by col2 desc nulls last) rnk
 12                 )
 13    measures (col2, col3, lpad(' ',4) col4, lpad(' ',4) col5)
 14    rules upsert
 15    (
 16      col2 [0] = col2 [1]
 17      , col3 [0] = col3 [1]
 18      , col4 [0] = col2 [2]
 19      , col5 [0] = col3 [2]
 20    )
 21  /

      COL1 COL2 COL3 COL4 COL5
---------- ---- ---- ---- ----
         1 ABC  Yes  ABC  NO
         2 XYZ  NO

SQL>

К сожалению, в таких решениях нам нужно указывать количество столбцов в запросе. То есть в обычном SQL нет механизма определения того, что таблица содержит три строки, где COL1 = 1, поэтому нам нужно семь столбцов, что не является необоснованным. Для ситуаций, в которых число значений сводки неизвестно во время кодирования, всегда есть динамический sql.

0 голосов
/ 10 апреля 2010

На основе AskTom :

select Col1,
max( decode( rn, 1, Col2 ) ) Col_1,
max( decode( rn, 1, Col3 ) ) Col_2,
max( decode( rn, 2, Col2 ) ) Col_3,
max( decode( rn, 2, Col3 ) ) Col_4
from (
    select Col1,
           Col2,
           Col3,
           row_number() over (partition by Col1 order by Col2 desc nulls last) rn
       from MyTable
            )
group by Col1;

У меня нет доступа к базе данных Oracle, чтобы проверить ее, но я думаю, что это сработает.Если для идентификатора может быть более двух записей, вы можете просто добавить больше строк к причине выбора с соответствующим номером строки.

...