Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хитрая группировка с итогами или что-то другое? / 6 сообщений из 6, страница 1 из 1
18.08.2016, 13:15:39
    #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
18.08.2016, 13:47:47
    #39293898
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрая группировка с итогами или что-то другое?
chikaginskкуда копатьgrouping sets
...
Рейтинг: 0 / 0
18.08.2016, 13:59:46
    #39293915
chikaginsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрая группировка с итогами или что-то другое?
Elic,

Благодарю за подсказку, надеюсь это то что нужно.
...
Рейтинг: 0 / 0
19.08.2016, 12:00:02
    #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
20.08.2016, 13:42:15
    #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
20.08.2016, 14:34:50
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хитрая группировка с итогами или что-то другое? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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