Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / написать SQL / 8 сообщений из 8, страница 1 из 1
18.04.2007, 15:36
    #34470112
написать SQL
не могу сообразить как написать следующую выборку

допустим есть исходная табличка с 2 колонками :
COLUMN1 COLUMN2
a&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspas
a&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp sd
a &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspdf
b &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspfg
b &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspgh
d &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp hj

Нужно выбрать в следующем виде
a &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp as,sd,df
b &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspfg, gh
d &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsphj
...
Рейтинг: 0 / 0
18.04.2007, 16:03
    #34470244
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать SQL
Не понятен принцип, по которому вы формируете выборку.
Я не уловил логики...
...
Рейтинг: 0 / 0
18.04.2007, 17:37
    #34470672
mekhos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать SQL
Набор символов во втором столбце выборки откуда берется?
...
Рейтинг: 0 / 0
19.04.2007, 04:45
    #34471430
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать SQL
2 Mark Barinstein & mekhos
Парни, вы меня удивляете...
Разве не понятно, что автор хочет интересного вида группировку: исходные данные из таблицы сгруппировать по полю COLUMN1, при этом соответствующие значения из поля COLUMN2 собрать в одну строку (в одно поле с разделителем "запятая")...
...
Рейтинг: 0 / 0
19.04.2007, 05:59
    #34471445
написать SQL
mekhos, Mark BarinsteinНе понятен принцип, по которому вы формируете выборку.
Я не уловил логики...
Извиняюсь что не донёс смысл вопроса.
Да, Сергей прав, мне нужна
группировка по первому столбцу, а во втором столбце данные обединяются(сливаются) в строку.
вид разделителя большой роли не играет
...
Рейтинг: 0 / 0
19.04.2007, 08:14
    #34471500
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать SQL
Ипользовал для этих целей рекурсивный запрос что-то типа такого (пишу по памяти):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
  WITH VIRTUAL_TABLE(COLUMN1, COLUMN2, NUM, CURRLEVEL) 
  AS ( 
   SELECT 
     COLUMN1,
     ltrim(COLUMN2),
     ROW_NUMBER() OVER (PARTITION BY COLUMN1 ORDER BY COLUMN2), -- определяет порядок в сцепке
      2                                                           -- текущий порядковый номер добавляемого к сцепке
   FROM my_table
   UNION ALL 
   SELECT 
     VT1.COLUMN1, 
     CASE
       WHERE VT1.NUM = VT1.CURRLEVEL THEN RTRIM(VT2.COLUMN2) || ','||rtrim(VT1.COLUMN2) 
       ELSE VT1.COLUMN2
     END, 
     VT1.NUM, 
     VT1.CURRLEVEL +  1 
   FROM 
     VIRTUAL_TABLE as VT1,
     VIRTUAL_TABLE as VT2,
   WHERE VT1.COLUMN1 = VT2.COLUMN1
     AND VT1.NUM  >= VT1.CURRLEVEL
     AND VT2.NUM  = VT1.NUM -  1 
     ) 
  SELECT COLUMN1, MAX(COLUMN2) FROM VIRTUAL_TABLE GROUP BY COLUMN1 

Кажется я даже без CASE обходился - достаточно было условий WHERE, но не помню как.
...
Рейтинг: 0 / 0
19.04.2007, 08:23
    #34471509
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать SQL
Если порядок в сцепке будешь делать другой - измени последний SELECT - по каждому COLUMN1 выбирать записи с максимальным значением CURRLEVEL.
...
Рейтинг: 0 / 0
19.04.2007, 09:17
    #34471601
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать SQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
with t (COLUMN1, COLUMN2) as
(
values
  ('a', 'as')
, ('a', 'sd')
, ('a', 'df')
, ('b', 'fg')
, ('b', 'gh')
, ('d', 'hj')
),
i (column1, curr_column2, all_column2) as
(
select column1
, min(column2) curr_column2
, cast(min(column2) as varchar( 255 )) all_column2
from t
group by column1
  union all
select i.column1
, t.column2 curr_column2
, i.all_column2||','||t.column2 all_column2
from i, t
where i.column1=t.column1 
and t.column2=
(
select min(column2)
from t t2
where t2.column1=i.column1 and t2.column2>i.curr_column2
)
)
select i.column1, i.all_column2
from i
join
(
select column1, max(curr_column2) curr_column2
from i
group by column1
) ig on ig.column1=i.column1 and ig.curr_column2=i.curr_column2
order by  1 
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / написать SQL / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]