powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с группировкой.
15 сообщений из 15, страница 1 из 1
Помогите с группировкой.
    #39731244
Piastry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В таблице есть id, prod

id prod
-- -----
1 a
2 a
3 a
4 a
5 b
6 b
7 b
8 c
9 c

если сделать группировку по каждому prod:

select prod, count(prod)
from table
group by prod

получется:

prod count(prod)
----- ----------
a 4
b 3
c 2

как сделать, чтобы вывелось количество 'a' и количество не 'a'?
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731249
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Piastry,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t (id, prod) as (
              select 1,  'a' from dual 
    union all select 2,  'a' from dual
    union all select 3,  'a' from dual
    union all select 4,  'a' from dual
    union all select 5,  'b' from dual
    union all select 6,  'b' from dual
    union all select 7,  'b' from dual
    union all select 8,  'c' from dual
    union all select 9,  'c' from dual
    union all select 10, ''  from dual
    union all select 11, ''  from dual
)
select 'количество ''a'': '    || count(*) from t where prod = 'a'
union all
select 'количество не ''a'': ' || count(*) from t where prod <> 'a' or prod is null
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731254
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorPiastry,
Код: plsql
1.
2.
3.
select 'количество ''a'': '    || count(*) from t where prod = 'a'
union all
select 'количество не ''a'': ' || count(*) from t where prod <> 'a' or prod is null


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select decode(prod,'a','a','others') key, count(*) c
from t
group by decode(prod,'a','a','others')
;

select sum(decode(prod,'a',1)) a
     , sum(decode(prod,'a',0,1)) others
from t
;
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731320
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

декоданс

group by decode(prod,'a','a','others') - вариант не очень чтобы очень
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731340
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorandrey_anonymous,

декоданс

group by decode(prod,'a','a','others') - вариант не очень чтобы очень

Ну да, двойной просмотр таблицы через UNION это точно ренессанс .

SY.
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731342
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Индекс можно создать, а вот что делать с decode(prod,'a','a','others'), когда понадобится то же самое по b или по с?
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731346
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorSY,

Индекс можно создать, а вот что делать с decode(prod,'a','a','others'), когда понадобится то же самое по b или по с?

У тебя во второй части UNION условие or prod is null, так что просто индекс даст IRS + FTS:


Код: 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.
SQL> create index tbl_idx on tbl(prod)
  2  /

Index created.

SQL> explain plan for
  2  select '''a'' quantity: '    || count(*) from tbl where prod = 'a'
  3  union all
  4  select 'not ''a'' quantity: '    || count(*) from tbl where prod <> 'a' or prod is null
  5  /

Explained.

SQL> select * from table(dbms_xplan.display)
  2  /

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1434934034

-------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |     2 |     4 |     4   (0)| 00:00:01 |
|   1 |  UNION-ALL          |         |       |       |            |          |
|   2 |   SORT AGGREGATE    |         |     1 |     2 |            |          |
|*  3 |    INDEX RANGE SCAN | TBL_IDX |     4 |     8 |     1   (0)| 00:00:01 |
|   4 |   SORT AGGREGATE    |         |     1 |     2 |            |          |
|*  5 |    TABLE ACCESS FULL| TBL     |     6 |    12 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("PROD"='a')
   5 - filter("PROD"<>'a' OR "PROD" IS NULL)

18 rows selected.

SQL> 




Можно конeчно:

Код: 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.
SQL> drop index tbl_idx
  2  /

Index dropped.

SQL> create index tbl_idx on tbl(prod,1)
  2  /

Index created.

SQL> explain plan for
  2  select '''a'' quantity: '    || count(*) from tbl where prod = 'a'
  3  union all
  4  select 'not ''a'' quantity: '    || count(*) from tbl where prod <> 'a' or prod is null
  5  /

Explained.

SQL> select * from table(dbms_xplan.display)
  2  /

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 683043970

------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |         |     2 |     4 |     2   (0)| 00:00:01 |
|   1 |  UNION-ALL         |         |       |       |            |          |
|   2 |   SORT AGGREGATE   |         |     1 |     2 |            |          |
|*  3 |    INDEX RANGE SCAN| TBL_IDX |     4 |     8 |     1   (0)| 00:00:01 |
|   4 |   SORT AGGREGATE   |         |     1 |     2 |            |          |
|*  5 |    INDEX FULL SCAN | TBL_IDX |     6 |    12 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("PROD"='a')
   5 - filter("PROD"<>'a' OR "PROD" IS NULL)

18 rows selected.

SQL> 



Но все равно два промотра индекса (IRS + IFS). А теперь сравни:


Код: 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.
SQL> explain plan for
  2  select sum(decode(prod,'a',1)) a
  3       , sum(decode(prod,'a',0,1)) others
  4  from tbl
  5  /

Explained.

SQL> select * from table(dbms_xplan.display)
  2  /

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 84988631

----------------------------------------------------------------------------
| Id  | Operation        | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT |         |     1 |     2 |     1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE  |         |     1 |     2 |            |          |
|   2 |   INDEX FULL SCAN| TBL_IDX |    11 |    22 |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------

9 rows selected.

SQL> explain plan for
  2  select decode(prod,'a','a','others') key, count(*) c
  3  from tbl
  4  group by decode(prod,'a','a','others')
  5  /

Explained.

SQL> select * from table(dbms_xplan.display)
  2  /

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2036211214

----------------------------------------------------------------------------
| Id  | Operation        | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT |         |     3 |     6 |     2  (50)| 00:00:01 |
|   1 |  HASH GROUP BY   |         |     3 |     6 |     2  (50)| 00:00:01 |
|   2 |   INDEX FULL SCAN| TBL_IDX |    11 |    22 |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------

9 rows selected.

SQL>  



Ну и число SORT AGGREGATE сравни.

SY.
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731368
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorчто делать с decode(prod,'a','a','others'), когда понадобится то же самое по b или по с?
Эээ... дай угадаю - поправить decode?
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731468
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SYМожно конeчно:

К sum(decode(...)) претензий и не было.

Можно сделать поле prod not null, задав к примеру 'n' как не определен, или создать FBI с подобным же правилом типа nvl(, плюс ограничение на вставку в поле значения 'n', условие модифицируется в соответствии с выбранным вариантом. И в таком случае group by decode(prod,'a','a','others') как минимум не быстрее.
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731480
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorgroup by decode(prod,'a','a','others') как минимум не быстрее.Не словоблужествуй, приводи код и план с union.
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731484
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

SYУ тебя во второй части UNION условие or prod is null, так что просто индекс даст IRS + FTSДаже в таком варианте группировка с декодом проигрывает по времени выполнения.
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731524
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorДажеСловоблудие хуже фактов.
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39731562
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Piastry,

Код: 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.
  1  with t (id, prod) as (
  2                select 1,  'a' from dual
  3      union all select 2,  'a' from dual
  4      union all select 3,  'a' from dual
  5      union all select 4,  'a' from dual
  6      union all select 5,  'b' from dual
  7      union all select 6,  'b' from dual
  8      union all select 7,  'b' from dual
  9      union all select 8,  'c' from dual
 10      union all select 9,  'c' from dual
 11      union all select 10, ''  from dual
 12      union all select 11, ''  from dual
 13  )
 14  select
 15    prod
 16   ,count(*) cc
 17   ,(sum(count(*)) over())-count(*) not_cc
 18  from t group by prod
 19* order by 1
SQL> /

P         CC     NOT_CC
- ---------- ----------
a          4          7
b          3          8
c          2          9
           2          9



.....
stax
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39732059
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Попробуй сам на паре-тройке миллионов строк.
...
Рейтинг: 0 / 0
Помогите с группировкой.
    #39732061
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorПопробуй самМолокосос, это тебе надо пытаться нас убедить.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с группировкой.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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