Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
От: DeathKnight Беларусь  
Дата: 08.11.13 17:13
Оценка:
Есть следующая проблема:
1. запись в таблице бд содержит несколько значений(колонок), которые могут быть null.
2. в результирующую выборку должно попасть n-строк по каждой записи в таблице, где n — количество not null значений.

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

Реально ли так вытянуть данные SQL-запросом? Или может ли кто-нибудь подсказать, как это сделать на PLSQL?

Спасибо.
P.S.: изменить структуру или требуемый результат выборки не представляется возможным.
Re: Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
От: wildwind Россия  
Дата: 08.11.13 20:57
Оценка: 1 (1)
Здравствуйте, DeathKnight, Вы писали:

Давай пример исходных данных и результата. Так не понятно.

Если нужно просто транспонировать столбцы в строки, то соединяешь кросс-джойном с набором из n строк и применяешь CASE.
Re[2]: Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
От: DeathKnight Беларусь  
Дата: 08.11.13 21:29
Оценка:
Примерно след вида данные в таблице:
a number,
b number,
c number,
d number,
e number

+ набор каких-то еще данных.

Допустим значения a,d,e — заполнены, b,cnull, тогда результат выборки должен выглядеть:

a, sa1, sc2
d, sd1, sd2
e, se1, se2



Где s** — или некоторые константы, которые будут обрабатываться в запросе выше или в коде, или какие-либо значения, которые будут подтягиваться подзапросами. Получается, если не заполнено ничего, в выборку по этой строке таблицы не должно попасть ничего, иначе — по одной строке на каждое значение.
Re: Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
От: Аноним  
Дата: 08.11.13 21:39
Оценка:
Здравствуйте, DeathKnight, Вы писали:

DK>Реально ли так вытянуть данные SQL-запросом? Или может ли кто-нибудь подсказать, как это сделать на PLSQL?

DK>P.S.: изменить структуру или требуемый результат выборки не представляется возможным.

Задачу понял смутно, но есть чувство, что здесь поможет PIVOT
Re[3]: Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
От: wildwind Россия  
Дата: 09.11.13 10:18
Оценка:
Здравствуйте, DeathKnight, Вы писали:

DK>Получается, если не заполнено ничего, в выборку по этой строке таблицы не должно попасть ничего, иначе — по одной строке на каждое значение.



with cols as (
  select 'a' col from dual
  union all select 'b' from dual
  union all select 'c' from dual
  union all select 'd' from dual
  union all select 'e' from dual
)
 select t.row_id
      , cols.col
      , case cols.col 
          when 'a' then t.a 
          when 'b' then t.b 
          when 'c' then t.c 
          when 'd' then t.d 
          when 'e' then t.e 
        end as val
   from t, cols
 where 
  case cols.col 
    when 'a' then t.a 
    when 'b' then t.b 
    when 'c' then t.c 
    when 'd' then t.d 
    when 'e' then t.e 
  end is not null
 order by row_id, col


Тест: http://www.sqlfiddle.com/#!4/7bf4f/1
Re[2]: Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
От: Olaf Россия  
Дата: 09.11.13 15:51
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Задачу понял смутно, но есть чувство, что здесь поможет PIVOT


Если быть точным, то Unpivot преобразует столбцы данных в строки
select row_id, col, value
from
(
    select *
    from t
) unpivot(value for col in (a, b, c, d, e))
order by row_id, value
Re[3]: Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
От: DeathKnight Беларусь  
Дата: 22.11.13 17:11
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Здравствуйте, Аноним, Вы писали:


А>>Задачу понял смутно, но есть чувство, что здесь поможет PIVOT


O>Если быть точным, то Unpivot преобразует столбцы данных в строки

O>
O>select row_id, col, value
O>from
O>(
O>    select *
O>    from t
O>) unpivot(value for col in (a, b, c, d, e))
O>order by row_id, value
O>


спасибо, попробую такой вариант.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.