powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хитрая группировка с итогами или что-то другое?
6 сообщений из 6, страница 1 из 1
Хитрая группировка с итогами или что-то другое?
    #39293877
chikaginsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!
Столкнулся со следующей задачей: вывести данные для одной Организации с одним Филиалом, с несколькими Отделениями в филиале, в каждом отделении может быть несколько Участков, каждый участок может продавать несколько разных Товаров, проданное количество которых известно.
Набросал такую структуру данных, чтобы было понятнее:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'рога' tov, 1 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'рога' tov, 2 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'копыта' tov, 1 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'копыта' tov, 2 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'рога' tov, 3 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'рога' tov, 4 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'копыта' tov, 3 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'копыта' tov, 4 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'рога' tov, 5 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'рога' tov, 6 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'копыта' tov, 5 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'копыта' tov, 6 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'рога' tov, 7 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'рога' tov, 8 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'копыта' tov, 7 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'копыта' tov, 8 kol from dual


Проблема в том, что не получается вывести данные в таком виде:
Верхний участокитогорога11Верхний участокитогокопыта11 Верхний участок итого все 22 Нижний участокитогорога15Нижний участокитогокопыта15 Нижний участок итого все 30 Северное отделениеитогорога26Северное отделениеитогокопыта26 Северное отделение итого все 52 Восточный участокитогорога3Восточный участокитогокопыта3 Восточный участок итого все 6 Западный участокитогорога7Западный участокитогокопыта7 Западный участок итого все 14 Южное отделениеитогорога10Южное отделениеитогокопыта10 Южное отделение итого все 20 Первый филиалитогорога36Первый филиалитогокопыта36 Первый филиал итого все 72 Рога и копытаитогорога36Рога и копытаитогокопыта36 Рога и копыта итого все 72
Сначала кинулся делать это группировкой с итогами (grouping() rollup()), но застрял в самом начале - на группировке по участкам.
Вообще "куда копать" есть идеи?
...
Рейтинг: 0 / 0
Хитрая группировка с итогами или что-то другое?
    #39293898
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chikaginskкуда копатьgrouping sets
...
Рейтинг: 0 / 0
Хитрая группировка с итогами или что-то другое?
    #39293915
chikaginsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Благодарю за подсказку, надеюсь это то что нужно.
...
Рейтинг: 0 / 0
Хитрая группировка с итогами или что-то другое?
    #39294495
chikaginsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу помощи. По наводке уважаемого Elic пытаюсь решить задачу вывода данных в необходимом виде с помощью grouping sets.
Вывод участков и отделений победил:
Код: plsql
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.
with a as (
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'рога' tov, 1 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'рога' tov, 2 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'копыта' tov, 1 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'копыта' tov, 2 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'рога' tov, 3 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'рога' tov, 4 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'копыта' tov, 3 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'копыта' tov, 4 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'рога' tov, 5 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'рога' tov, 6 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'копыта' tov, 5 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'копыта' tov, 6 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'рога' tov, 7 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'рога' tov, 8 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'копыта' tov, 7 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'копыта' tov, 8 kol from dual
)
select case when grouping(otd)=0 and grouping(uch)=0 and grouping(tov)=0 then uch
            when grouping(otd)=0 and grouping(uch)=0 and grouping(tov)=1 then uch
            when grouping(otd)=0 and grouping(uch)=1 and grouping(tov)=0 then otd
            when grouping(otd)=0 and grouping(uch)=1 and grouping(tov)=1 then otd
       end as uchastok,
       'итого' itog,
       case when grouping(tov)=0 then tov
            when grouping(tov)=1 then 'все'
       end as tovar,
       sum(kol) kol,
       '',
       grouping(otd) g_otd,
       grouping(uch) g_uch,
       grouping(tov) g_tov
from a
group by grouping sets ((otd,uch,tov), rollup(otd,uch), (otd,tov))
order by otd, uch, tov


Но правильно вывести в разрезе филиала и организации никак не получается.
Как только не пытался - выводит неправильно. Никак не пойму в чём проблема.
Перед уже введёнными группами в grouping sets из кода выше добавляю группы для fil и org.
В сортировке написал:
Код: plsql
1.
order by otd, uch, tov, fil, org


Сортирует верно, но с группировкой проблемы...
...
Рейтинг: 0 / 0
Хитрая группировка с итогами или что-то другое?
    #39294925
chikaginsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного разобравшись с grouping sets понял, что rollup() в моей задаче не нужен, а нужно использовать группы.
Сгруппировал вроде верно, все записи выводятся, но теперь проблема с сортировкой - по организации и филиалу отсортировал, но дальше как ни бьюсь, не получается получить требуемый результат. Помогите пожалуйста.
Код: plsql
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.
with a as (
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'рога' tov, 1 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'рога' tov, 2 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'копыта' tov, 1 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'копыта' tov, 2 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'рога' tov, 3 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'рога' tov, 4 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'копыта' tov, 3 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'копыта' tov, 4 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'рога' tov, 5 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'рога' tov, 6 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'копыта' tov, 5 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'копыта' tov, 6 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'рога' tov, 7 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'рога' tov, 8 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'копыта' tov, 7 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'копыта' tov, 8 kol from dual
)
select case when grouping(otd)=0 and grouping(uch)=0 and grouping(tov)=0 then uch
            when grouping(otd)=0 and grouping(uch)=0 and grouping(tov)=1 then uch
            when grouping(otd)=0 and grouping(uch)=1 and grouping(tov)=0 then otd
            when grouping(otd)=0 and grouping(uch)=1 and grouping(tov)=1 then otd
            when grouping(fil)=0 then fil
            when grouping(org)=0 then org
       end as uchastok,
       'итого' itog,
       case when grouping(tov)=0 then tov
            when grouping(tov)=1 then 'все'
       end as tovar,
       sum(kol) kol,
       '',
       grouping(org) g_org,
       grouping(fil) g_fil
from a
group by grouping sets (org,(org,tov), fil,(fil,tov), otd,(otd,uch), (otd,uch,tov), (otd,tov))
order by grouping(org) desc, 
         grouping(fil) desc


Может сгруппировано неправильно. В чём может быть проблема?
...
Рейтинг: 0 / 0
Хитрая группировка с итогами или что-то другое?
    #39294939
chikaginsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё, разобрался.
Код: plsql
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.
with a as (
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'рога' tov, 1 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'рога' tov, 2 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'копыта' tov, 1 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Восточный участок' uch, 'копыта' tov, 2 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'рога' tov, 3 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'рога' tov, 4 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'копыта' tov, 3 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Южное отделение' otd, 'Западный участок' uch, 'копыта' tov, 4 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'рога' tov, 5 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'рога' tov, 6 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'копыта' tov, 5 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Верхний участок' uch, 'копыта' tov, 6 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'рога' tov, 7 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'рога' tov, 8 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'копыта' tov, 7 kol from dual union all
select 'Рога и копыта' org, 'Первый филиал' fil, 'Северное отделение' otd, 'Нижний участок' uch, 'копыта' tov, 8 kol from dual
)
select case when grouping(otd)=0 and grouping(uch)=0 and grouping(tov)=0 then uch
            when grouping(otd)=0 and grouping(uch)=0 and grouping(tov)=1 then uch
            when grouping(otd)=0 and grouping(uch)=1 and grouping(tov)=0 then otd
            when grouping(otd)=0 and grouping(uch)=1 and grouping(tov)=1 then otd
            when grouping(fil)=0 then fil
            when grouping(org)=0 then org
       end as uchastok,
       'итого' itog,
       case when grouping(tov)=0 then tov
            when grouping(tov)=1 then 'все'
       end as tovar,
       sum(kol) kol,
       '',
       grouping_id(org,fil),
       grouping_id(tov)
from a
group by grouping sets (org,(org,tov), fil,(fil,tov), otd,(otd,uch), (otd,uch,tov), (otd,tov))
order by grouping_id(org,fil) desc,
         otd,uch,grouping(tov)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хитрая группировка с итогами или что-то другое?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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