2009-11-24 4 views
2

мой вопрос, с какой-то фон:Транспонирование выберите результаты с Oracle

Я должен сгенерировать SQL запросов на основе метаданных таблицы (формат колонки), и в результате что-то вроде:

TABLENAME1|COL1 
TABLENAME1|COL2 
TABLENAME2|COL1 
TABLENAME2|COL2 
TABLENAME2|COL3 
TABLENAME3|COL1 
TABLENAME4|COL1 
TABLENAME4|COL2 
... /*some other 1800 rows */ 

(Да, это заказано.) что мне нужно будет перенести эти данные, на основе первого столбца, так что ожидаемый результат будет:

TABLENAME1|COL1|COL2|NULL 
TABLENAME2|COL1|COL2|COL3 
TABLENAME3|COL1|NULL|NULL 
TABLENAME4|COL1|COL2|NULL 
/* less then 1800 rows ;-) */ 

можно ли нам Oracle SQL?

Заранее благодарен!

ответ

2

Если вы хотите создать запрос для каждого вызова или использовать жёстко прописанные Max-столбец-счетчик, то вы можете сделать что-то подобное:

WITH tab AS 
(
    SELECT table_name, column_name FROM user_tab_cols WHERE column_id <= 4 
) -- user_tab_cols used to provide test data, use your table instead 
SELECT MAX(c1) c1, 
     MAX(c2) c2, 
     MAX(c3) c3, 
     MAX(c4) c4 
    FROM (SELECT table_name, 
       DECODE(column_id, 1, column_name) c1, 
       DECODE(column_id, 2, column_name) c2, 
       DECODE(column_id, 3, column_name) c3, 
       DECODE(column_id, 4, column_name) c4 
      FROM (SELECT table_name, 
         column_name, 
         ROW_NUMBER() OVER (PARTITION BY table_name ORDER BY column_name) column_id 
        FROM tab 
       ) 
     ) 
GROUP BY table_name 
ORDER BY table_name 

Если достаточно, чтобы получить его в что форма

TABLENAME1|COL1,COL2 
TABLENAME2|COL1,COL2,COL3 

взглянуть на Тома Кайта-х stragg.

+0

Спасибо, я попробую! –

+0

Штраг Тома Ките помог. –

1

Ключевое слово, которое вы ищете, это pivot. Here's пример его использования. Синтаксис, как правило, совпадает с MSSQL, и поскольку я не знаю URL-адреса для документации Oracle, я подниму ссылку MSDN и надеюсь, что кто-то, кто знает больше о макете страницы Oracle, чем я, отредактирует его, указывая на свою документацию ,

РЕДАКТИРОВАТЬ: Oracle documentation, найдите достаточное количество поворота, и вы дойдете до деталей.

+0

Pivot был одним из самых крутых дополнений, чтобы поразить SQL когда-либо. Хотите денормализовать результаты запроса без строгих кодировок или писать неприятные курсоры? Pivot! – Dathan

+0

Но работает ли это, когда я не сейчас, сколько столбцов появится в таблице результатов? –

+0

В SQL не существует возможности сделать динамическое число столбцов, не имеющих динамического генерирования SQL в вашем переднем конце, прежде чем запускать его. Если вы знаете максимальное количество столбцов, которые могут появиться в наборе результатов, тогда он должен работать нормально, если вы не против пучка нулей. – Donnie

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