Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
Есть
1 1 15.10.07
1 2 06.11.07
1 3 20.12.07
2 1 10.07.07
2 2 10.08.07
2 3 10.09.07

Надо
1 151007061107201207
2 100707100807100907

Создал объект,как описано у Т. Кайта и неоднократно на данном форуме STRSUM_t.
Получил аггрегатную ф-ию STRSUM.
Все вроде бы ничего, но при соединении строк неверно сортируются даты, т.е. получаю

1 151007201207061107
2 100807100707100907

В чем может быть проблема?
17 окт 07, 15:10    [4805790]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
teapot25
В чем может быть проблема?

В order by
17 окт 07, 15:13    [4805813]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116328
А через SYS_CONNECT_BY_PATH не хотите ?
Ну как хотите ... :-)
17 окт 07, 15:14    [4805827]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
Order by не поможет, т.к.сортировка по дате или по стринге разные.
Надо чтобы по дате работала...
17 окт 07, 15:33    [4805998]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
teapot25
Order by не поможет, т.к.сортировка по дате или по стринге разные.
Надо чтобы по дате работала...

Брррр...
Еще раз, с начала.
С примерами.
17 окт 07, 15:34    [4806010]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
teapot25
Order by не поможет, т.к.сортировка по дате или по стринге разные.
Надо чтобы по дате работала...

Чем Вас не устроил ответ Андрея и Дмитрия не очень понятно. Все вроде сортируется:
with t as (select 1 num, 1 id, to_date('15.10.07', 'dd.mm.yy') dt from dual
  union all
  select 1 num, 2 id, to_date('06.11.07', 'dd.mm.yy') dt from dual
  union all
  select 1 num, 3 id, to_date('20.12.07', 'dd.mm.yy') dt from dual
  union all
  select 2 num, 1 id, to_date('10.07.07', 'dd.mm.yy') dt from dual
  union all
  select 2 num, 2 id, to_date('10.08.07', 'dd.mm.yy') dt from dual
  union all
  select 2 num, 3 id, to_date('10.09.07', 'dd.mm.yy') dt from dual)
select num, replace((sys_connect_by_path(dt, ' ')), ' ', '') from (
  select num,
    dt,
    row_number() over (partition by num order by num) rn,
    count(*) over (partition by num) cnt
  from t
  order by num, dt)
where rn = cnt
start with rn = 1
connect by prior num = num
  and rn = prior rn + 1
17 окт 07, 15:43    [4806078]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
teapot25
Order by не поможет, т.к.сортировка по дате или по стринге разные.
Надо чтобы по дате работала...
просто order by раньше :)
17 окт 07, 15:46    [4806100]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116328
xymbo
Чем Вас не устроил ответ Андрея и Дмитрия не очень понятно. Все вроде сортируется:


Ага, только формат строки можно изменить, если автору это важно ...
...
    to_char(dt,'DDMMYY') dt,
...
17 окт 07, 15:46    [4806106]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
На исходном примере

BOX_NUMBER PENCIL_COLOR DATA
1 Yellow 03.01.2006
1 Blue 01.02.2006
1 Green 02.03.2006
1 bbb 05.05.2006
1 aaa 04.06.2006
2 Cyan 01.01.2006
2 Red 12.01.2006
2 Orange 02.02.2006
3 Pink 01.01.2006
3 Tan 02.02.2006
4 Gray 01.01.2006
4 Black 01.02.2006
4 White 04.04.2006
4 Turquoise 03.05.2006

Т.е. все записи отсортированы
order by box_number, data

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


select q.box_number, STRSUM(q.data) pencil_colors
from (
select *
FROM pencil_box pb
order by pb.box_number, pb.data
) q
GROUP BY q.box_number

получаю

BOX_NUMBER PENCIL_COLORS
1 03.01.06,01.02.06,02.03.06,04.06.06,05.05.06
2 01.01.06,12.01.06,02.02.06
3 01.01.06,02.02.06
4 01.01.06,01.02.06,04.04.06,03.05.06


Здесь только одна ошибка в группе 1. Но реально их много
17 окт 07, 15:47    [4806117]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116328
dmidek
xymbo
Чем Вас не устроил ответ Андрея и Дмитрия не очень понятно. Все вроде сортируется:


Ага, только формат строки можно изменить, если автору это важно ...
...
    to_char(dt,'DDMMYY') [color=red]dt[/color],
...


Вернее надо использовать другой псевдоним, чтобы сортировка по dt была верной
17 окт 07, 15:48    [4806125]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
teapot25
На исходном примере


"Скажи-ка дядя" (c), а в поле какого типа у тебя хранится дата ?
17 окт 07, 15:50    [4806145]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
поле DATA - date
17 окт 07, 15:55    [4806181]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
teapot25
Здесь только одна ошибка в группе 1. Но реально их много
если делать только подзапрос, отсортировано верно?
17 окт 07, 15:58    [4806203]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
select *
FROM pencil_box pb
order by pb.box_number, pb.data

BOX_NUMBER PENCIL_COLOR DATA
1 Yellow 03.01.2006
1 Blue 01.02.2006
1 Green 02.03.2006
1 bbb 05.05.2006
1 aaa 04.06.2006
2 Cyan 01.01.2006
2 Red 12.01.2006
2 Orange 02.02.2006
3 Pink 01.01.2006
3 Tan 02.02.2006

В подзапросе отсортировано верно.
17 окт 07, 16:00    [4806216]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
teapot25
поле DATA - date


А не врешь ?


1 Yellow 03.01.2006
...
select q.box_number, STRSUM(q.data) pencil_colors
...
получаю

BOX_NUMBER PENCIL_COLORS
1 03.01.06...


Какое-то у тебя подозрительное использование формата по-умолчанию.

Давай-ка пример на SQL*Plus в студию.
17 окт 07, 16:01    [4806220]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
dmidek
dmidek
xymbo
Чем Вас не устроил ответ Андрея и Дмитрия не очень понятно. Все вроде сортируется:


Ага, только формат строки можно изменить, если автору это важно ...
...
    to_char(dt,'DDMMYY') [color=red]dt[/color],
...


Вернее надо использовать другой псевдоним, чтобы сортировка по dt была верной

Это да, я просто потом посмотрел, в каком формате он сохраняет.
+1 к ДГ.
17 окт 07, 16:04    [4806245]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
Да все примеры, вроде уже привел.
Вот описание таблицы

desc pencil_box;

Name Type Null?
-----------------------------------------------
BOX_NUMBER NUMBER(0)
PENCIL_COLOR VARCHAR2(10)
DATA DATE



select *
from pencil_box;

BOX_NUMBER PENCIL_COL DATA
---------- ---------- --------
1 Green 02.03.06
1 Yellow 03.01.06
1 Blue 01.02.06
2 Red 12.01.06
2 Orange 02.02.06
2 Cyan 01.01.06
3 Pink 01.01.06
3 Tan 02.02.06
4 Black 01.02.06
4 Gray 01.01.06
4 White 04.04.06
4 Turquoise 03.05.06
1 aaa 04.06.06
1 bbb 05.05.06

14 строк выбрано.
17 окт 07, 16:19    [4806365]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
Кстати, предложенный вариант через sys_connect_by_path тоже дает неверную сортировку

with t as (select pb.box_number num , pb.data dt
from pencil_box pb
)
select num, replace((sys_connect_by_path(dt, ' ')), ' ', '')
from (
select num,
dt,
row_number() over (partition by num order by num) rn,
count(*) over (partition by num) cnt
from t
order by num, dt
)
where rn = cnt
start with rn = 1
connect by prior num = num
and rn = prior rn + 1;

--------------------------------------------------------------
1 04.06.0603.01.0601.02.0605.05.0602.03.06
2 12.01.0602.02.0601.01.06
3 02.02.0601.01.06
4 04.04.0603.05.0601.02.0601.01.06
17 окт 07, 16:26    [4806425]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Значит это из-за функции сортировка меняется. Если версия Oracle >= 9, то используйте sys_connect_by_path , зачем Вам вообще функция?
17 окт 07, 16:26    [4806428]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
Oracle 10.
17 окт 07, 16:29    [4806444]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
teapot25
Кстати, предложенный вариант через sys_connect_by_path тоже дает неверную сортировку


Ибо


with t as (select pb.box_number num , pb.data dt
from pencil_box pb
)
select num, replace((sys_connect_by_path(dt, ' ')), ' ', '')
from (
select num,
dt,
row_number() over (partition by num order by num) rn,
...


а надо partition by num order by dt
17 окт 07, 16:30    [4806452]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Да, упустил, с аналитикой надо быть аккуратнее. :(
17 окт 07, 16:34    [4806483]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
Дубовая голова
teapot25
Кстати, предложенный вариант через sys_connect_by_path тоже дает неверную сортировку


Ибо


with t as (select pb.box_number num , pb.data dt
from pencil_box pb
)
select num, replace((sys_connect_by_path(dt, ' ')), ' ', '')
from (
select num,
dt,
row_number() over (partition by num order by num) rn,
...


а надо partition by num order by dt



Блиннннн. Спасибо.
17 окт 07, 16:39    [4806520]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
teapot25
Member

Откуда:
Сообщений: 42
Но все же, в чем проблема по первому варианту?
Уж очень симпатичное решение.
17 окт 07, 16:41    [4806531]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
teapot25
Но все же, в чем проблема по первому варианту?
Уж очень симпатичное решение.


Группировка использует внутренние алгоритмы сортировки, нарушая
первоначальный порядок уже отсортированных записей.
17 окт 07, 16:43    [4806546]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить