Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с группировкой. / 15 сообщений из 15, страница 1 из 1
11.11.2018, 02:15
    #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
11.11.2018, 03:13
    #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
11.11.2018, 03:58
    #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
11.11.2018, 13:55
    #39731320
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с группировкой.
andrey_anonymous,

декоданс

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

декоданс

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

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

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

Индекс можно создать, а вот что делать с decode(prod,'a','a','others'), когда понадобится то же самое по b или по с?
...
Рейтинг: 0 / 0
11.11.2018, 15:24
    #39731346
SY
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
11.11.2018, 16:25
    #39731368
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с группировкой.
SkilledJuniorчто делать с decode(prod,'a','a','others'), когда понадобится то же самое по b или по с?
Эээ... дай угадаю - поправить decode?
...
Рейтинг: 0 / 0
11.11.2018, 21:59
    #39731468
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с группировкой.
SYМожно конeчно:

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

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

SYУ тебя во второй части UNION условие or prod is null, так что просто индекс даст IRS + FTSДаже в таком варианте группировка с декодом проигрывает по времени выполнения.
...
Рейтинг: 0 / 0
12.11.2018, 07:33
    #39731524
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с группировкой.
SkilledJuniorДажеСловоблудие хуже фактов.
...
Рейтинг: 0 / 0
12.11.2018, 10:11
    #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
12.11.2018, 21:35
    #39732059
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с группировкой.
Elic,

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


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