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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> аналог sum для строк, PL/SQL 
:(
    Опции темы
Kbl4AH
Дата 12.2.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день.
table:
STR | INT
-----------
q     | 1
w    | 2
e     | 1
r     | 1
t     | 2
y     | 1

Нужно выбрать значения поля STR, для которых I = const, но чтобы результат был не
STR
-----
rec1
...
recN

, а
STR
-----
rec1 || ... || recN

Например, для выбора STR where INT = 1, результат:
STR
-----
qery

Возможно это?

PM MAIL ICQ   Вверх
Zloxa
Дата 12.2.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



oracle 6?

Это сообщение отредактировал(а) Zloxa - 12.2.2009, 11:28


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


Советчик
****


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

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



В некоторых диалектах есть функции конкатенации строк для группы (скажем в mySQL это group_concat), в некоторых нет. 
В тех, где этого нет, для получения такого результата возможно использование хранимых процедур. Опять-таки если оно есть.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
v2v
Дата 12.2.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Для Оракла SYS_CONNECT_BY_PATH (Это кажется мне как раз Zloxa  и подсказал когда то smile ) либо своя Pl/Sql функция




Это сообщение отредактировал(а) v2v - 12.2.2009, 11:33


--------------------
PM   Вверх
Kbl4AH
Дата 12.2.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Zloxa @  12.2.2009,  11:05 Найти цитируемый пост)
oracle 6?

Угу :(
Я, конечно, эту проблему уже средствами Делфи обошел...
Но вопрос интересный, поэтому хочется услышать решение, не обязательно для 6-ки, а для любой удобной версии...

Добавлено через 1 минуту и 9 секунд
Цитата(Akina @  12.2.2009,  11:17 Найти цитируемый пост)
скажем в mySQL это group_concat

круто smile 
PM MAIL ICQ   Вверх
Zloxa
Дата 12.2.2009, 12:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(Kbl4AH @  12.2.2009,  12:02 Найти цитируемый пост)
для любой удобной версии.

9i+
1) Единственный честный способ - User-Defined Aggregate. Требует создания объектов схемы, что не всегда возможно.
Реализация от кайта

2) не честный через sys_connect_by_path
Код

SQL> with t as (
  2    select 'q' str, 1 int from dual
  3    union all select 'w' str, 2 int from dual
  4    union all select 'e' str, 1 int from dual
  5    union all select 'r' str, 1 int from dual
  6    union all select 't' str, 2 int from dual
  7    union all select 'y' str, 1 int from dual)
  8  select replace(max(sys_connect_by_path(str,'~')),'~') sumstr,int
  9    from (select row_number() over (partition by int order by null) rn
 10                , t.*
 11          from t) t
 12  start with rn = 1
 13  connect by prior int = int and prior rn = rn -1
 14  group by int
 15  ;
 
SUMSTR            INT
---------- ----------
qery                1
tw                  2


3) нечестный вариант - через преобразование в XML
(можно потерять лидирующие и завершающие пробелы)
Код

 15  select dbms_xmlgen.convert(xmlagg(XMLElement("a",str) /*order by ???*/).extract('//a/text()').GetStringVal(),1) sumstr
 16    ,int
 17  from t group by int
 18  ;
 
SUMSTR            INT
---------- ----------
qeyr                1
wt                  2


10g
4) нечестный вариант -  использовать недокументированную функцию wm_concat
можно потерять запятые, нельзя указать порядок внутренней сортировки
Код

  8  select replace(wm_concat(str),',') sumstr, int
  9  from t
 10  group by int
 11  ;
 
SUMSTR            INT
---------- ----------
qeyr                1
wt                  2


Наверное есть еще способы smile


Это сообщение отредактировал(а) Zloxa - 18.5.2010, 12:24


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


Опытный
**


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

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



Спасибо, Zloxa.
+1 за исчерпывающий ответ!
Варианты для 9ки и XML для меня пока сложноваты...
А для 10ки - понравился, запомню на будущее...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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