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

Откуда: Гостья из будущего
Сообщений: 436
Есть примерно такие данные:

with t as 
(
select 'Донецк' location, 	'Иванов' fio, 'Ручки'     doc from dual
union all
select 'Донецк' location, 	'Иванов' fio, 'Карандаши' doc from dual
union all
select 'Kиев' location, 	'Сидоров' fio, 'Шарик'    вoc from dual
union all
select 'Киев' location, 	'Сидоров' fio, 'Цветок' doc from dual
)

select t.* from t



Надо выстроить в таком виде:

Донецк Иванов
Ручки
Карандаши

Киев Сидоров
Шарик
Цветок

Я походила по форму - есть похожие задачи и гораздо сложнее.

Объясните, пожалуйста на простом примере как это делается.
17 апр 07, 18:41    [4033196]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Донецк работает ручками и карандашами,
а Киев развлекается с шариками и цветками... :-)))
Всё как всегда?
(Off topic, sorry)
17 апр 07, 18:47    [4033222]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
GlukOza
Member

Откуда: Гостья из будущего
Сообщений: 436
Я впервые сталкиваюсь с group by rollup() - с первого раза трудно понять
17 апр 07, 18:53    [4033248]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116152
Вы хотите разобраться ?
Тогда я бы предложил Вам проанализировать следующий запрос ...

SQL> with t as
  2  (
  3  select 'Donezk' location, 	'Ivanov' fio, 'Ruchki'     doc from dual
  4  union all
  5  select 'Donezk' location, 	'Ivanov' fio, 'Karandashi'     doc from dual
  6  union all
  7  select 'Kiev' location, 	'Petrov' fio, 'Sharik'     doc from dual
  8  union all
  9  select 'Kiev' location, 	'Petrov' fio, 'Tsvetok'     doc from dual
 10  )
 11  select location, fio, doc, grouping(location), grouping(fio), grouping(doc) from t
 12  group by rollup(location,fio,doc)
 13  /

LOCATION FIO    DOC        GROUPING(LOCATION) GROUPING(FIO) GROUPING(DOC)
-------- ------ ---------- ------------------ ------------- -------------
Kiev     Petrov Sharik                      0             0             0
Kiev     Petrov Tsvetok                     0             0             0
Kiev     Petrov                             0             0             1
Kiev                                        0             1             1
Donezk   Ivanov Ruchki                      0             0             0
Donezk   Ivanov Karandashi                  0             0             0
Donezk   Ivanov                             0             0             1
Donezk                                      0             1             1
                                            1             1             1

9 rows selected

SQL> 

Обратите внимание, в каком виде представлены данные.
Подумайте, от чего это зависит.
Затем обратите внимание на значение функции grouping.
Подумайте, почему в ней так расположены значения 0 или 1 .
Когда Вы поймете это, Вам будет ясно, как отфильтровать
нужные Вам строки.
Ну а затем Вам останется только догадаться, как маскировать
"лишние" значения.

Удачи !
Если будут вопросы, задавайте.
Но постарайтесь продвинуться сами как можно дальше ...
17 апр 07, 18:55    [4033258]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
А вы уверены, что для вашей задачи требуется именно ROLLUP?

Нарисуйте еще раз, но аккуратно тот результат, который вы желаете получить.
17 апр 07, 18:55    [4033259]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
GlukOza
Member

Откуда: Гостья из будущего
Сообщений: 436
SQL*Plus
А вы уверены, что для вашей задачи требуется именно ROLLUP?

Нарисуйте еще раз, но аккуратно тот результат, который вы желаете получить.


Донецк
Иванов
Ручки
Карандаши

Киев
Сидоров
Шарик
Цветок
17 апр 07, 19:07    [4033322]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
GlukOza
Member

Откуда: Гостья из будущего
Сообщений: 436
SQL*Plus
А вы уверены, что для вашей задачи требуется именно ROLLUP?

Нарисуйте еще раз, но аккуратно тот результат, который вы желаете получить.



Донецк 
         Иванов 
                    Ручки 
                    Карандаши

Киев 
         Сидоров
                    Шарик 
                    Цветок

17 апр 07, 19:08    [4033328]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
SQL> with t as
  2  (
  3  select 'Donezk' location,  'Ivanov' fio, 'Ruchki'     doc from dual
  4  union all
  5  select 'Donezk' location,  'Ivanov' fio, 'Karandashi'     doc from dual
  6  union all
  7  select 'Kiev' location,  'Petrov' fio, 'Sharik'     doc from dual
  8  union all
  9  select 'Kiev' location,  'Petrov' fio, 'Tsvetok'     doc from dual
 10  ),
 11  x as
 12  (
 13  select  1
 14  from  dual
 15  connect by level < 4
 16  )
 17  select  *
 18    from  (
 19           select  case row_number() over(partition by location order by 1)
 20                     when 1
 21                       then location
 22                   end location,
 23                   case row_number() over(partition by location,fio order by 1)
 24                     when 2
 25                       then fio
 26                   end fio,
 27                   case row_number() over(partition by location,fio,doc order by 1)
 28                     when 3
 29                       then doc
 30                   end doc
 31             from  t,
 32                   x
 33           )
 34    where location || fio || doc is not null
 35  /

LOCATI FIO    DOC
------ ------ ----------
Donezk
       Ivanov
              Karandashi
              Ruchki
Kiev
       Petrov
              Sharik
              Tsvetok

8 rows selected.

SQL> 

SY.
17 апр 07, 20:21    [4033539]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
Goldminer
Member

Откуда:
Сообщений: 553
SY

А че так сложно-то? Да и вопрос вроде про rollup...
with t as
(
  select 'Donezk' location, 	'Ivanov' fio, 'Ruchki'     doc from dual
  union all
  select 'Donezk' location, 	'Ivanov' fio, 'Karandashi'     doc from dual
  union all
  select 'Kiev' location, 	'Petrov' fio, 'Sharik'     doc from dual
  union all
  select 'Kiev' location, 	'Petrov' fio, 'Tsvetok'     doc from dual
)
  select 
    DECODE(GROUPING(fio), 1, location), 
    DECODE(GROUPING(doc), 1, fio), 
    doc from t
  group by rollup(location,fio,doc)
  ORDER BY  location, GROUPING(fio) desc, fio, GROUPING(doc) desc, doc
17 апр 07, 20:35    [4033583]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
Goldminer

А че так сложно-то?


It was just an attempt to do it without rollup inspired by:

SQL*Plus
А вы уверены, что для вашей задачи требуется именно ROLLUP?


Goldminer

Да и вопрос вроде про rollup


Which was already pretty much answered by dmidek.

SY.

Сообщение было отредактировано: 17 апр 07, 20:55
17 апр 07, 20:55    [4033634]     Ответить | Цитировать Сообщить модератору
 Re: group by rollup()  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
Goldminer
SY

А че так сложно-то? Да и вопрос вроде про rollup...
with t as
(
  select 'Donezk' location, 	'Ivanov' fio, 'Ruchki'     doc from dual
  union all
  select 'Donezk' location, 	'Ivanov' fio, 'Karandashi'     doc from dual
  union all
  select 'Kiev' location, 	'Petrov' fio, 'Sharik'     doc from dual
  union all
  select 'Kiev' location, 	'Petrov' fio, 'Tsvetok'     doc from dual
)
  select 
    DECODE(GROUPING(fio), 1, location), 
    DECODE(GROUPING(doc), 1, fio), 
    doc from t
  group by rollup(location,fio,doc)
  ORDER BY  location, GROUPING(fio) desc, fio, GROUPING(doc) desc, doc


And BTW, your solution is a bit off. It picks up an extra row:

SQL> with t as
  2  (
  3    select 'Donezk' location,  'Ivanov' fio, 'Ruchki'     doc from dual
  4    union all
  5    select 'Donezk' location,  'Ivanov' fio, 'Karandashi'     doc from dual
  6    union all
  7    select 'Kiev' location,  'Petrov' fio, 'Sharik'     doc from dual
  8    union all
  9    select 'Kiev' location,  'Petrov' fio, 'Tsvetok'     doc from dual
 10  )
 11  select rownum,x.* from (
 12    select
 13      DECODE(GROUPING(fio), 1, location),
 14      DECODE(GROUPING(doc), 1, fio),
 15      doc from t
 16    group by rollup(location,fio,doc)
 17    ORDER BY  location, GROUPING(fio) desc, fio, GROUPING(doc) desc, doc
 18  ) x
 19  /

    ROWNUM DECODE DECODE DOC
---------- ------ ------ ----------
         1 Donezk
         2        Ivanov
         3               Karandashi
         4               Ruchki
         5 Kiev
         6        Petrov
         7               Sharik
         8               Tsvetok
         9

9 rows selected.

SQL> 

It should be something like:

with t as
(
  select 'Donezk' location,  'Ivanov' fio, 'Ruchki'     doc from dual
  union all
  select 'Donezk' location,  'Ivanov' fio, 'Karandashi'     doc from dual
  union all
  select 'Kiev' location,  'Petrov' fio, 'Sharik'     doc from dual
  union all
  select 'Kiev' location,  'Petrov' fio, 'Tsvetok'     doc from dual
)
  select 
    DECODE(GROUPING(fio), 1, location), 
    DECODE(GROUPING(doc), 1, fio), 
    doc from t
  group by rollup(location,fio,doc)
  having GROUPING(location) = 0
  ORDER BY  location, GROUPING(fio) desc, fio, GROUPING(doc) desc, doc
/

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