Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Групировка т вывод значений в одну строку.  [new]
пытливый
Guest
Неподскажете как собрать все значения одного из столбцов в 1 строчку при условии что они равны по значениям одного из столбцов?
из
gropmac
1 12551
1 565514
2 5595
1 56596
2 89655
1 895659
1 8959

получить:
gropmac
1 56596 и 895659 и 8959и 565514 и 12551
2 5595и 89655


Вот что я мудрю, но почемуто не выходит
WITH Tabl AS
(select 1 grop, '12551' mac from dual union all
select 1, '565514' from dual union all
select 2, '5595' from dual union all
select 1, '56596' from dual union all
select 2, '89655' from dual union all
select 1, '895659' from dual union all
select 1, '8959' from dual )
SELECT	SYS_CONNECT_BY_PATH(mac, ', ')
FROM
(	SELECT	mac,
		rownum 
	FROM	Tabl		     
)

CONNECT BY PRIOR rn+1=rn
START WITH rn=1

Заранее спасибо за помошь- аналитика для меня темный лес- пытаюсь изучать
21 фев 08, 14:51    [5322902]     Ответить | Цитировать Сообщить модератору
 Re: Групировка т вывод значений в одну строку.  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
FAQ не пытались посмотреть? :)

А что касается Вашего варианта, то вместо rownum использовать row_number() over (partition by grop order by null)
+ остался ещё один шаг - группировка по grop и вывод max(mac)
PS: вопрос производительности, совместимости SYS_CONNECT_BY_PATH и аналитики и ограничения SYS_CONNECT_BY_PATH по длине оставим пока в стороне :)
21 фев 08, 14:58    [5322973]     Ответить | Цитировать Сообщить модератору
 Re: Групировка т вывод значений в одну строку.  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862

WITH Tabl AS
(select 1 grop, '12551' mac from dual union all
select 1, '565514' from dual union all
select 2, '5595' from dual union all
select 1, '56596' from dual union all
select 2, '89655' from dual union all
select 1, '895659' from dual union all
select 1, '8959' from dual)
select grop
      , ltrim(
          XMLElement(
            "All", XMLAgg(XmlForest(' и '||Tabl.mac "Mac") order by Tabl.mac)
          ).extract('/All/Mac/text()').getStringVal()
        , ' и '
      ) mac
from Tabl
group by grop;

Posted via ActualForum NNTP Server 1.4

21 фев 08, 15:01    [5323009]     Ответить | Цитировать Сообщить модератору
 Re: Групировка т вывод значений в одну строку.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
WITH Tabl AS
(select 1 grop, '12551' mac from dual union all
 select 1, '565514' from dual union all
 select 2, '5595' from dual union all
 select 1, '56596' from dual union all
 select 2, '89655' from dual union all
 select 1, '895659' from dual union all
 select 1, '8959' from dual )
SELECT	grop,max(SYS_CONNECT_BY_PATH(mac, ', '))
FROM
(	SELECT	mac, grop
		,row_number() over (partition by grop order by mac) rn
	FROM	Tabl		

)
CONNECT BY PRIOR rn+1=rn and grop = prior grop
START WITH rn=1
group by grop
21 фев 08, 15:01    [5323012]     Ответить | Цитировать Сообщить модератору
 Re: Групировка т вывод значений в одну строку.  [new]
пытливый
Guest
громадное спасибо.
21 фев 08, 15:18    [5323201]     Ответить | Цитировать Сообщить модератору
 Re: Групировка т вывод значений в одну строку.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Again, there is no need to do GROUP BY:

SQL> COLUMN path format a50
SQL> WITH Tabl AS
  2  (select 1 grop, '12551' mac from dual union all
  3   select 1, '565514' from dual union all
  4   select 2, '5595' from dual union all
  5   select 1, '56596' from dual union all
  6   select 2, '89655' from dual union all
  7   select 1, '895659' from dual union all
  8   select 1, '8959' from dual )
  9  SELECT grop,max(SYS_CONNECT_BY_PATH(mac, ', ')) path
 10  FROM
 11  ( SELECT mac, grop
 12    ,row_number() over (partition by grop order by mac) rn
 13   FROM Tabl  
 14  )
 15  CONNECT BY PRIOR rn+1=rn and grop = prior grop
 16  START WITH rn=1
 17  group by grop
 18  /

      GROP PATH
---------- --------------------------------------------------
         1 , 12551, 565514, 56596, 895659, 8959
         2 , 5595, 89655

SQL> WITH Tabl AS
  2  (select 1 grop, '12551' mac from dual union all
  3   select 1, '565514' from dual union all
  4   select 2, '5595' from dual union all
  5   select 1, '56596' from dual union all
  6   select 2, '89655' from dual union all
  7   select 1, '895659' from dual union all
  8   select 1, '8959' from dual )
  9  SELECT grop,SYS_CONNECT_BY_PATH(mac, ', ') path
 10  FROM
 11  ( SELECT mac, grop
 12    ,row_number() over (partition by grop order by mac) rn
 13    ,count(*) over (partition by grop) cnt
 14   FROM Tabl  
 15  )
 16  WHERE level = cnt
 17  CONNECT BY PRIOR rn+1=rn and grop = prior grop
 18  START WITH rn=1
 19  /

      GROP PATH
---------- --------------------------------------------------
         1 , 12551, 565514, 56596, 895659, 8959
         2 , 5595, 89655

SQL> 

SY.
21 фев 08, 17:14    [5324364]     Ответить | Цитировать Сообщить модератору
 Re: Групировка т вывод значений в одну строку.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
And in 10g there is even no need for count(*):

SQL> WITH Tabl AS
  2  (select 1 grop, '12551' mac from dual union all
  3   select 1, '565514' from dual union all
  4   select 2, '5595' from dual union all
  5   select 1, '56596' from dual union all
  6   select 2, '89655' from dual union all
  7   select 1, '895659' from dual union all
  8   select 1, '8959' from dual )
  9  SELECT grop,SYS_CONNECT_BY_PATH(mac, ', ') path
 10  FROM
 11  ( SELECT mac, grop
 12    ,row_number() over (partition by grop order by mac) rn
 13   FROM Tabl  
 14  )
 15  WHERE connect_by_isleaf = 1
 16  CONNECT BY PRIOR rn+1=rn and grop = prior grop
 17  START WITH rn=1
 18  /

      GROP PATH
---------- --------------------------------------------------
         1 , 12551, 565514, 56596, 895659, 8959
         2 , 5595, 89655

SQL> 

SY.
21 фев 08, 17:16    [5324379]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить