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

Не сталкивался ли кто с такой штукой:
надо что-то типа (на деле гораздо сложнее)

Код: plaintext
1.
2.
select count(*), name
from somebase
group by name


но чтобы в count было не число, а процент (доля)
от общего количества записей
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158848
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот бы еще версию Оракла указал. На Oracle 9.2 Enterprise Edition:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create table test (
    test_id number( 9 )
  , value number( 9 )
  , constraint pk_test primary key (test_id)
)
/

begin
  dbms_random.seed(sysdate);
  for i in  1 .. 10000  loop
    insert into test(test_id, value) values (i, trunc(dbms_random.value *  10 ));
  end loop;
  commit;
end;
/

select value
     , count(*)
     , ratio_to_report(count(*)) over() *  100   percent
from test
group by value
/
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158853
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так, на вскидку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select 
 owner,to_char(count( 1 )/sum(count( 1 )) over () * 100 ,'00.00') as pct
from
 all_tables
group by owner;

SQLWKS> select 
      2 >  owner,to_char(count( 1 )/sum(count( 1 )) over () * 100 ,'00.00') as pct
      3 > from
      4 >  all_tables
      5 > group by owner
      6 > 
OWNER                          PCT   
 ------------------------------ ------
 
QQ                               20 . 95 
WEB                              07 . 82 
MSSQL                            00 . 28 
NEW_TEST                         00 . 84 
OUTLN                            00 . 56 
SYS                              52 . 79 
SYSTEM                           13 . 97 
TEST                             02 . 79 
Выбрано  8  строк.
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158855
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Check this example:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> select deptno,
   2   count(*) department_employee_count,
   3   (select count(*) from emp) company_employee_count,
   4   count(*)/(select count(*) from emp) *  100  department_eployee_percent
   5   from emp
   6   group by deptno;

    DEPTNO DEPARTMENT_EMPLOYEE_COUNT COMPANY_EMPLOYEE_COUNT DEPARTMENT_EPLOYEE_PERCENT
 ---------- ------------------------- ---------------------- --------------------------
 
         10                           3                       14                   21 . 4285714 
         20                           5                       14                   35 . 7142857 
         30                           6                       14                   42 . 8571429 



SY.
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158864
Andrej
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sorry,
version 8.1.7.4.1

Спасибо, такой запрос
работает и в "восьмерке".
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158877
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov: Ох, Денис, Денис увлекаешься ты излишне PL/SQL :) :) :)
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158887
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это про заполнение таблицы в цикле? А, ерунда, просто так рука повернулась. Могу и через insert .. select, а для личных нужд давно pipelined-функция наготове, хотя это тоже pl/sql. Зато, изменив пару строк кода, могу commit'ов по дороге навставлять.
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158896
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Denis Popov:
Да я так к слову :)
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158902
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Denis

Люблю отрабатывать такие примерчики...

Если возможно краткое понятное истолкование

ratio_to_report(count(*)) over() * 100 percent

объясните плиз на этом конкретном примере.
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158906
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle9i Data Warehousing Guide
SQL for Analysis in Data Warehouses
RATIO_TO_REPORT
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96520/analysis.htm#15896

Ну а по-человечески: подсосываешь ей какое-то число, в данном случае это count(*) (классно, что можно не статическое число подсовывать, а агрегирующую функцию), и для каждой записи возвращается коэффициент "попадания".Остаелся умножить на 100 - получаем процент.

ИМХО можно и не знать об этой функции, гляди остальные примеры. А можно и с ней.
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158917
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример SY ясен.

адаптировала запрос softbuilder'а к вашему примеру

Код: plaintext
1.
2.
3.
4.
5.
select value
     , count(*)
     , to_char(count( 1 )/sum(count( 1 )) over () * 100 ,'00.00') as pct
from test
group by value
/


К какаму выражению относится over ()? Что в данном случае подразумевает over?

PS
Смотрела как то доку по over() сходу не поняла:-( Придется попотеть потом.
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158927
raven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мона еще так

Подсчитывает доли различных id в разрезе общего числа строк

select id, RATIO_TO_REPORT(COUNT(*)) OVER ()
from tst
group by id;

CREATE TABLE tst
(name VARCHAR2(5),
id VARCHAR2(5))
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158968
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Violina: может здесь можно почитать:
Oracle9i SQL Reference
SQL Functions
Analytic Functions
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/functions2a.htm#81409
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158971
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, вопрос был, зачем именно в этом запросе следует ставить over(). Вот без него выражение sum(count()) начинает мешать. Остается сформулировать, почему.
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32158991
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BTW, analytic function RATIO_TO_REPORT is available in 8i.

SY.
...
Рейтинг: 0 / 0
Запрос с группировкой и процентами
    #32159080
raven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Violina

В общем случае, имеем

over(PARTITION BY <expr>)

The PARTITION BY clause defines the groups on which the RATIO_TO_REPORT function is to be computed. If the PARTITION BY clause is absent, then the function is computed over the whole query result set.

т.е. over() - операция над всем множеством.

Если таблица содержит следующие значения
1 50
1 50
1 100
2 200
то запрос
select id, RATIO_TO_REPORT(sum(value)) OVER ()
from tst
group by id;
вернет
1 0,5 (50+50+100)/400
2 0,5 (200)/400
а запрос
select value, RATIO_TO_REPORT(sum(value)) OVER (id)
from tst
group by id;
вернет
1 1 (50+50+100)/(50+50+100)
2 1 (200/200)

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


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