Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобрахование строк в колонку, из строк получить одну строку и кчу коло 
:(
    Опции темы
integral
Дата 11.9.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

Репутация: нет
Всего: нет



Здраствуйте,
есть необходимость реализовать преобрахование строк в колонки, т.е.
есть такая выборка
f1  v1
f2  v2
f3 v3
...
fi   vi
требуется получить
v1 v2 v3 .... vi
желательно что бы f1 f2 f3 стали названиями этих колонок, но это не критично.
бьюсь весь день  smile  Идей у меня совсем нет  smile 
Спасибо smile 

Это сообщение отредактировал(а) integral - 11.9.2009, 21:32


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
Zloxa
Дата 11.9.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Код

select case when id = 'f1' then val end f1
       case when id = 'f2' then val end f2
       case when id = 'f3' then val end f3
from table




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
integral
Дата 11.9.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

Репутация: нет
Всего: нет



над подобным вариантом думал, но тут проблема в том что количество элементов в выборке я не знаю заранее, т.е. более правильный вариант постановки задачи:
из
f1  v1
f2  v2
.....
fi vi
получить
v1 v2 .... vi


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
Temdegon
Дата 11.9.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: нет
Всего: 9



Смотря что тебе нужно потом с данными делать. Для чего тебе это нужно?
Я с Oracle не знаком вообще, но на PostgreSQL мне нужно было реализовать что-то похожее. Есть резалт запроса:
Цитата

A
B
C


А нужно было вывести из в одной строке. Написал агрегатную функцию, как SUM(), только она суммирует строки.
В результате запрос принимает вид
Код

SELECT TRIM(SUM_STR(a ||', '), ' ,')
FROM TABLE


и возвращает 
Цитата

'A, B, C' 

что меня устаривало на 100%.
Но если нужно именно что бы каждая строка возвращалась одтдельным полем одной строки, то тут уже надо смотреть в сторону множеств, массивов и преобразований между ними. 
PM MAIL   Вверх
Zloxa
Дата 12.9.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(integral @  11.9.2009,  21:31 Найти цитируемый пост)
количество элементов в выборке я не знаю заранее

Парадигма SQL - ты описываешь структуру результата в конструкции запроса. Структура результата не зависит от набора данных.
В твоем случае без динамического формирования текста запроса не обойтись.
Код

SQL> create table test as select 'f1' id,  'v1' val from dual
  2    union all  select 'f2' id,  'v2' val from dual
  3    union all select 'f3' id,  'v3' val from dual;

Table created.

SQL> var result refcursor;
SQL> declare
  2    sql_text  varchar2(32000);
  3    is_first_row boolean := true;
  4  begin
  5    for i in (select distinct id from test)
  6    loop
  7      if not is_first_row then
  8         sql_text := sql_text || ',';
  9      else
 10         sql_text := 'select ';
 11      end if;
 12      is_first_row := false;
 13      sql_text := sql_text || 'case when id ='''||i.id||''' then val end "'||
i.id||'"';
 14    end loop;
 15    sql_text := sql_text || ' from test';
 16    open :result for sql_text;
 17  end;
 18  /

PL/SQL procedure successfully completed.

SQL> print result;

f2 f3 f1
-- -- --
      v1
v2
   v3

SQL>



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
avvo
Дата 12.9.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 11.9.2007

Репутация: 2
Всего: 4



В 11g появилась фича pivot.
Для меньших версий вариант только с динамическим SQL (для неизвестного заранее кол-ва столбцов),
можно тут глянуть.
Для 11g вот тут описано применение pivot.

А вообще, зачем такое нужно? Тем более с неизвестным количеством столбцов? Это ведь явно какой-то клиентский вызов. Просто внутри БД такие результаты, с неизвестным количеством столбцов, не нужны.
А на клиенте транспонировать резалтсет гораздо проще, там ведь явно что-то типа Java, Delphi, C++, C#
PM MAIL   Вверх
integral
Дата 15.9.2009, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

Репутация: нет
Всего: нет



Всем спасибо за ответы, вы очень помогли
Цитата

зачем такое нужно? 

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


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.