[ora] Агрегация
От: Funny Rabbit Россия  
Дата: 27.03.20 05:10
Оценка:
Есть таблица

with a as (
select 'a' as fio,  '116-935-936 86' as inn
from dual connect by level < 4
union all
select 'b' as fio,  '046-944-605 86' as inn
from dual connect by level < 4
union all
select 'c' as fio,  '046-947-949 18' as inn
from dual connect by level < 4
)
select * from a


Надо:
1. Сгруппировать по фио и инн.
2. После каждой такой группы вывести пустую строчку.

Помогите. 3 дня голову ломаю
То что меня не убивает, делает меня умнее.
Re: [ora] Агрегация
От: Olaf Россия  
Дата: 27.03.20 07:36
Оценка:
Здравствуйте, Funny Rabbit, Вы писали:

FR>Надо:

FR>1. Сгруппировать по фио и инн.
FR>2. После каждой такой группы вывести пустую строчку.

FR>Помогите. 3 дня голову ломаю


А как это должно выглядеть, т.е. не совсем понятно, что есть пустая строка после каждой группы ?

Только предполагаю. Так ?
Re[2]: [ora] Агрегация
От: Funny Rabbit Россия  
Дата: 27.03.20 08:33
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Здравствуйте, Funny Rabbit, Вы писали:


FR>>Надо:

FR>>1. Сгруппировать по фио и инн.
FR>>2. После каждой такой группы вывести пустую строчку.

FR>>Помогите. 3 дня голову ломаю


O>А как это должно выглядеть, т.е. не совсем понятно, что есть пустая строка после каждой группы ?


O>Только предполагаю. Так ?

O>Image: EmptyRow.png

Да. Извиняюсь за упущения. Это мой косяк. Выглядеть должно именно так.
То что меня не убивает, делает меня умнее.
Re[3]: [ora] Агрегация
От: Olaf Россия  
Дата: 27.03.20 08:41
Оценка: 4 (1)
Здравствуйте, Funny Rabbit, Вы писали:

FR>Да. Извиняюсь за упущения. Это мой косяк. Выглядеть должно именно так.


Как один из вариантов:
with a as (
select 'a' as fio,  '116-935-936 86' as inn
from dual connect by level < 4
union all
select 'b' as fio,  '046-944-605 86' as inn
from dual connect by level < 4
union all
select 'c' as fio,  '046-947-949 18' as inn
from dual connect by level < 4
)
select case when b.Type = 1 then a.fio else b.Empty end as fio
       ,case when b.Type = 1 then a.inn else b.Empty end as inn
from
(
  select fio, inn
  from a
  group by fio, inn
) a
cross join (select 1 as Type, null as Empty from dual union all select 2, 'пустая строка' from dual) b
order by a.fio, a.inn, b.Type
Re[4]: [ora] Агрегация
От: Funny Rabbit Россия  
Дата: 27.03.20 08:49
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Как один из вариантов:

O>
O>with a as (
O>select 'a' as fio,  '116-935-936 86' as inn
O>from dual connect by level < 4
O>union all
O>select 'b' as fio,  '046-944-605 86' as inn
O>from dual connect by level < 4
O>union all
O>select 'c' as fio,  '046-947-949 18' as inn
O>from dual connect by level < 4
O>)
O>select case when b.Type = 1 then a.fio else b.Empty end as fio
O>       ,case when b.Type = 1 then a.inn else b.Empty end as inn
O>from
O>(
O>  select fio, inn
O>  from a
O>  group by fio, inn
O>) a
O>cross join (select 1 as Type, null as Empty from dual union all select 2, 'пустая строка' from dual) b
O>order by a.fio, a.inn, b.Type
O>


После С пустой строки нет
То что меня не убивает, делает меня умнее.
Re[5]: [ora] Агрегация
От: Olaf Россия  
Дата: 27.03.20 08:57
Оценка: 4 (1)
Здравствуйте, Funny Rabbit, Вы писали:

FR>После С пустой строки нет


cross join (select 1 as Type, null as Empty from dual union all select 2, 'пустая строка' from dual) b


Вместо слова 'пустая строка' вы можете вставить ''
Re[6]: [ora] Агрегация
От: Funny Rabbit Россия  
Дата: 27.03.20 09:25
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Здравствуйте, Funny Rabbit, Вы писали:


FR>>После С пустой строки нет


O>
cross join (select 1 as Type, null as Empty from dual union all select 2, 'пустая строка' from dual) b


O>Вместо слова 'пустая строка' вы можете вставить ''


Спасибо. Это был общий пример. Щас получается так.

Тульская область ГУЗ.Узловская РБ. Диагностическое отделение кабинет функциональной диагностики Январь 11693593686
Тульская область ГУЗ.Узловская РБ. Диагностическое отделение кабинет функциональной диагностики Январь 11693593686
Тульская область Январь
Тульская область Январь
Тульская область ГУЗ.Узловская РБ. Диагностическое отделение Кабинет ультразвуковой диагностики Январь 04694460586
Тульская область Январь
Тульская область ГУЗ.Узловская РБ. Диагностическое отделение Январь 04694794918
Тульская область ГУЗ.Узловская РБ. Диагностическое отделение Январь 04694794918
Тульская область Январь
Тульская область Январь

Т.е. Если в группе больше одной записи, то и пустых строк равно количество в группе. А надо чтобы одну. Олаф. Помоги.
То что меня не убивает, делает меня умнее.
Отредактировано 27.03.2020 9:26 Funny Rabbit . Предыдущая версия .
Re[7]: [ora] Агрегация
От: Olaf Россия  
Дата: 27.03.20 09:36
Оценка: 6 (1)
Здравствуйте, Funny Rabbit, Вы писали:

FR>Т.е. Если в группе больше одной записи, то и пустых строк равно количество в группе. А надо чтобы одну. Олаф. Помоги.


Так у вас там группировка, по fio и inn, она должна свернуть все записи в группу (одну запись).
Или эта группа чисто виртуальная, и на самом деле не нужно ничего группировать, а необходимо отобразить пустую строку только для одной записи этой "виртуальной" группы ?
Re[8]: [ora] Агрегация
От: Funny Rabbit Россия  
Дата: 27.03.20 09:42
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Здравствуйте, Funny Rabbit, Вы писали:


FR>>Т.е. Если в группе больше одной записи, то и пустых строк равно количество в группе. А надо чтобы одну. Олаф. Помоги.


O>Так у вас там группировка, по fio и inn, она должна свернуть все записи в группу (одну запись).

O>Или эта группа чисто виртуальная, и на самом деле не нужно ничего группировать, а необходимо отобразить пустую строку только для одной записи этой "виртуальной" группы ?

Второй вариант
То что меня не убивает, делает меня умнее.
Re[9]: [ora] Агрегация
От: Olaf Россия  
Дата: 27.03.20 18:17
Оценка:
Здравствуйте, Funny Rabbit, Вы писали:

O>>Так у вас там группировка, по fio и inn, она должна свернуть все записи в группу (одну запись).

O>>Или эта группа чисто виртуальная, и на самом деле не нужно ничего группировать, а необходимо отобразить пустую строку только для одной записи этой "виртуальной" группы ?

FR>Второй вариант


Если только так...
with a as (
select 'a' as fio,  '116-935-936 86' as inn
from dual connect by level < 5
union all
select 'b' as fio,  '046-944-605 86' as inn
from dual connect by level < 4
union all
select 'c' as fio,  '046-947-949 18' as inn
from dual connect by level < 1
union all
select 'a' as fio,  '046-947-949 18' as inn
from dual connect by level < 1
union all
select 'c' as fio,  '046-944-605 86' as inn
from dual connect by level < 4
)
select c.fio, c.inn
from
(
    select fio, inn, fio as key1, inn as key2, row_number() over(partition by fio, inn order by fio, inn) as n
    from a
    union all
    select ' ' as fio , ' ' as inn, fio, inn, count(*) + 1 as cnt
    from a
    group by fio, inn
) c
order by c.key1, c.key2, n
Re[10]: [ora] Агрегация
От: IZM  
Дата: 28.03.20 21:18
Оценка:
Select
case when nn is not null then fio else ‘Пусто’ end as Fio2,
case when nn is not null then Inn else ‘Пусто’ end as Inn2
From
(
Select distinct Fio, Inn, IDRow_In_Group as NN From table
Union all
Select distinct Fio, Inn, Null as NN From table
) q
Order by fio,inn,NN nulls last
--
Получается то же самое что и в предыдущем ответе
Отредактировано 28.03.2020 22:45 IZM . Предыдущая версия . Еще …
Отредактировано 28.03.2020 22:37 IZM . Предыдущая версия .
Отредактировано 28.03.2020 22:22 IZM . Предыдущая версия .
Отредактировано 28.03.2020 22:04 IZM . Предыдущая версия .
Отредактировано 28.03.2020 21:54 IZM . Предыдущая версия .
Re: [ora] Агрегация
От: Dym On Россия  
Дата: 29.03.20 19:23
Оценка:
Здравствуйте, Funny Rabbit, Вы писали:

FR>Надо:

FR>1. Сгруппировать по фио и инн.
FR>2. После каждой такой группы вывести пустую строчку.

FR>Помогите. 3 дня голову ломаю

Коллега, я понимаю, что почитать документацию по oracle это не ваш метод, но прошу обратить внимание на предложение group by rollup
 with a as (
select 'a' as fio,  '116-935-936 86' as inn
from dual connect by level < 4
union all
select 'b' as fio,  '046-944-605 86' as inn
from dual connect by level < 4
union all
select 'c' as fio,  '046-947-949 18' as inn
from dual connect by level < 4
)
select a.*, grouping_id(fio, inn) from a group by  rollup(fio, inn)

Возможно это то, что вам нужно. А используя функцию grouping_id и инструкцию case when можно добиться чего угодно.
Счастье — это Glück!
Re: [ora] Агрегация
От: wildwind Россия  
Дата: 30.03.20 09:16
Оценка: +1
Здравствуйте, Funny Rabbit, Вы писали:

FR>Надо:

FR>1. Сгруппировать по фио и инн.
FR>2. После каждой такой группы вывести пустую строчку.

А вывести пустую строчку без помощи SQL никак?

FR>Помогите. 3 дня голову ломаю


А мог бы написать пару строк кода за 15 минут.
Re: [ora] Агрегация
От: GarryIV  
Дата: 10.04.20 06:47
Оценка:
Здравствуйте, Funny Rabbit, Вы писали:

FR>Надо:

FR>1. Сгруппировать по фио и инн.
group by фио, инн

FR>2. После каждой такой группы вывести пустую строчку.

Это задача для уровня презентации, не для DAO.
WBR, Igor Evgrafov
Re: [ora] Агрегация
От: IZM  
Дата: 15.04.20 20:19
Оценка:
Еще одно решение (Вдруг пригодится):
with a as (
select 'a' as fio, '116-935-936 86' as inn, level as Lv
from dual connect by level < 4
union all
select 'b' as fio, '046-944-605 86' as inn, level
from dual connect by level < 4
union all
select 'c' as fio, '046-947-949 18' as inn, level
from dual connect by level < 4
)
select
case when a.lv is null then null else a.fio end as Fio,
case when a.lv is null then null else a.inn end as Inn
from a
group by GROUPING sets((a.fio,a.inn, a.lv),(a.fio,a.inn))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.