powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос группировка данных
14 сообщений из 14, страница 1 из 1
Запрос группировка данных
    #39836677
AidarH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть следующие данные:
Код: 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.
with base as (select 11 as id, 
                     'Казань' as city , 
                     1 as curr, -- тек 
                     0 as prev -- пред 
                     from dual
union all
select 11, 'Казань', 1, 0 from dual
union all
select 12, 'Буинск', 1, 0 from dual
union all
select 12, 'Буинск', 1, 0 from dual
union all
select 12, 'Буинск', 1, 0 from dual
union all
select 12, 'Буинск', 0, 1 from dual
union all
select 12, 'Буинск', 0, 1 from dual
union all
select 13, 'Заинск', 1, 0 from dual
union all
select 13, 'Заинск', 1, 0 from dual
union all
select 13, 'Заинск', 0, 1 from dual
union all
select 15, 'Томск', 1, 0 from dual
union all
select 15, 'Томск', 0, 1 from dual
)
select * 
       from base



Необходимо получить следующий набор данных

Наименование Количество
Казань 2
Буинск 3
Заинск 2
Города кроме томска 7
Города пред кроме томска 3
Томск 1
Томск пред 1
Все города 8
Все города пред 4

Как можно сделать запрос с помощью аналитических функций без лишних union all?
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836686
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 'Наименование Количество
Казань 2
Буинск 3
Заинск 2
Города кроме томска 7
Города пред кроме томска 3
Томск 1
Томск пред 1
Все города 8
Все города пред 4' from dual;

http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836687
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AidarH,

Что Томск делает в списке Татарстанских городов?
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836688
AidarH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,

Это просто для примера.
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836689
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AidarHКак можно сделать запрос с помощью аналитических функций без лишних union all?Аналитические функции не генерируют новых строк.
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836692
AidarH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

А как можно тогда с помощью rollup или cube или группировок?
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836693
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AidarHА как можно тогда с помощью rollup или cube или группировок?Не имеет смысла, пока задача не формализована.
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836732
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AidarHЭто просто для примера.Елабугу добавь
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836984
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то типа:

Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
with base as (select 11 as id,
                     'Kazan' as city ,
                     1 as curr, -- ???
                     0 as prev -- ????
                     from dual
union all
select 11, 'Kazan', 1, 0 from dual
union all
select 12, 'Buinsk', 1, 0 from dual
union all
select 12, 'Buinsk', 1, 0 from dual
union all
select 12, 'Buinsk', 1, 0 from dual
union all
select 12, 'Buinsk', 0, 1 from dual
union all
select 12, 'Buinsk', 0, 1 from dual
union all
select 13, 'Zainsk', 1, 0 from dual
union all
select 13, 'Zainsk', 1, 0 from dual
union all
select 13, 'Zainsk', 0, 1 from dual
union all
select 15, 'Tomsk', 1, 0 from dual
union all
select 15, 'Tomsk', 0, 1 from dual
)
select  case grouping(city) + group_id()
          when 1 then 'Tomsk prev'
          when 2 then 'Cities except Tomsk'
          when 3 then 'Cities prev except Tomsk'
          when 4 then 'All cities'
          when 5 then 'All cities prev'
          else city
        end city,
        case grouping(city) + group_id()
          when 1 then sum(case city when 'Tomsk' then prev end)
          when 2 then sum(case city when 'Tomsk' then 0 else curr end)
          when 3 then sum(case city when 'Tomsk' then 0 else prev end)
          when 5 then sum(prev)
          else sum(curr)
        end cnt
  from  base
  group by grouping sets ((),(),(),(),(),(city))
  order by group_id(),
           max(id)
/

CITY                            CNT
------------------------ ----------
Kazan                             2
Buinsk                            3
Zainsk                            2
Tomsk                             1
Tomsk prev                        1
Cities except Tomsk               7
Cities prev except Tomsk          3
All cities                        8
All cities prev                   4

9 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836995
mdbelov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, but wrong row order.
подгон решения под ответ:
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
WITH
   base AS
      (SELECT 11 AS id, 'Казань' AS city, 1 AS curr, 0 AS prev FROM DUAL
       UNION ALL
       SELECT 11, 'Казань', 1, 0 FROM DUAL
       UNION ALL
       SELECT 12, 'Буинск', 1, 0 FROM DUAL
       UNION ALL
       SELECT 12, 'Буинск', 1, 0 FROM DUAL
       UNION ALL
       SELECT 12, 'Буинск', 1, 0 FROM DUAL
       UNION ALL
       SELECT 12, 'Буинск', 0, 1 FROM DUAL
       UNION ALL
       SELECT 12, 'Буинск', 0, 1 FROM DUAL
       UNION ALL
       SELECT 13, 'Заинск', 1, 0 FROM DUAL
       UNION ALL
       SELECT 13, 'Заинск', 1, 0 FROM DUAL
       UNION ALL
       SELECT 13, 'Заинск', 0, 1 FROM DUAL
       UNION ALL
       SELECT 15, 'Томск', 1, 0 FROM DUAL
       UNION ALL
       SELECT 15, 'Томск', 0, 1 FROM DUAL)
  SELECT 
         CASE
            WHEN GROUPING_ID (b.id, b.city) = 0 THEN b.city
            WHEN GROUPING_ID ('Города кроме томска') = 0 THEN 'Города кроме томска'
            WHEN GROUPING_ID ('Все города пред') = 0 THEN 'Все города пред'
            WHEN GROUPING_ID ('Города пред кроме томска') = 0 THEN 'Города пред кроме томска'
            WHEN GROUPING_ID ('Томск пред') = 0 THEN 'Томск пред'
            WHEN GROUPING_ID ('Все города') = 0 THEN 'Все города'
         END
            "Наименование",
         CASE
            WHEN GROUPING_ID (b.id, b.city) = 0 THEN SUM (curr)
            WHEN GROUPING_ID ('Города кроме томска') = 0 THEN SUM (DECODE (b.city, 'Томск', 0, curr))
            WHEN GROUPING_ID ('Все города пред') = 0 THEN SUM (DECODE (b.prev, 1, 1, 0))
            WHEN GROUPING_ID ('Города пред кроме томска') = 0 THEN SUM (DECODE (b.prev, 1, DECODE (b.city, 'Томск', 0, 1), 0))
            WHEN GROUPING_ID ('Томск пред') = 0 THEN SUM (DECODE (b.prev, 1, DECODE (b.city, 'Томск', 1, 0), 0))
            WHEN GROUPING_ID ('Все города') = 0 THEN SUM (curr)
         END
            "Количество"
    FROM base b
GROUP BY GROUPING SETS ((b.id, b.city),
                        ('Города кроме томска'),
                        ('Города пред кроме томска'),
                        ('Томск пред'),
                        ('Все города'),
                        ('Все города пред'))
ORDER BY NVL (
            b.id,
            CASE "Наименование"
               WHEN 'Томск пред' THEN 15
               WHEN 'Города кроме томска' THEN 14
               WHEN 'Города пред кроме томска' THEN 14
               WHEN 'Все города' THEN 16
               WHEN 'Все города пред' THEN 17
            END),
          "Наименование"
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39836998
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdbelovSY, but wrong row order.


Ну и в чем проблема:

Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
with base as (select 11 as id,
                     'Kazan' as city ,
                     1 as curr, -- ???
                     0 as prev -- ????
                     from dual
union all
select 11, 'Kazan', 1, 0 from dual
union all
select 12, 'Buinsk', 1, 0 from dual
union all
select 12, 'Buinsk', 1, 0 from dual
union all
select 12, 'Buinsk', 1, 0 from dual
union all
select 12, 'Buinsk', 0, 1 from dual
union all
select 12, 'Buinsk', 0, 1 from dual
union all
select 13, 'Zainsk', 1, 0 from dual
union all
select 13, 'Zainsk', 1, 0 from dual
union all
select 13, 'Zainsk', 0, 1 from dual
union all
select 15, 'Tomsk', 1, 0 from dual
union all
select 15, 'Tomsk', 0, 1 from dual
)
select  case grouping(city) + group_id()
          when 1 then 'Cities except Tomsk'
          when 2 then 'Cities prev except Tomsk'
          when 3 then 'Tomsk prev'
          when 4 then 'All cities'
          when 5 then 'All cities prev'
          else city
        end city,
        case grouping(city) + group_id()
          when 1 then sum(case city when 'Tomsk' then 0 else curr end)
          when 2 then sum(case city when 'Tomsk' then 0 else prev end)
          when 3 then sum(case city when 'Tomsk' then prev end)
          when 5 then sum(prev)
          else sum(curr)
        end cnt
  from  base
  group by grouping sets ((),(),(),(),(),(city))
  order by case city
             when 'Tomsk' then 1.1
             else group_id()
           end,
           nvl2(city,max(id),null) nulls last
/

CITY                            CNT
------------------------ ----------
Kazan                             2
Buinsk                            3
Zainsk                            2
Cities except Tomsk               7
Cities prev except Tomsk          3
Tomsk                             1
Tomsk prev                        1
All cities                        8
All cities prev                   4

9 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39837004
mdbelov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SYmdbelovSY, but wrong row order.


Ну и в чем проблема:


Нет проблемы, твой вариант теперь 146 из 100! Я забыл про group_id() и получился этот пятничный ужас.
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39837050
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdbelovтвой вариант теперь 146 из 100!А на самом деле - страшный разовый говнокод, потому что
Elicзадача не формализована.
...
Рейтинг: 0 / 0
Запрос группировка данных
    #39837314
AidarH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем, кто принимал участие спасибо за помощь. Доброго дня и хорошего настроения.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос группировка данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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