2015-07-22 3 views
1

У меня есть данные, как показано ниже ..Для вычисления процентного значения

count    ID 
---------------------- 
10     1 
20     2 
30     4 

Как можно достичь третий столбец, который вычисляет процент в оракула.

count    ID % 
------------------------------------- 
10     1 10/(10+20+30) 
20     2 20/(10+20+30) 
30     4 30/(10+20+30) 

ответ

0
SELECT id, count, (count/(SELECT SUM(count) FROM table) * 100) as per FROM table GROUP BY id 
+0

Вы можете удалить умножение 100, если вам просто нужно значение/sumofvalue –

2

Использование RATIO_TO_REPORT

SQL Fiddle

Запрос:

with your_table(count_, id_) as (
    select 10,1 from dual union all 
    select 20,2 from dual union all 
    select 30,4 from dual 
) 
select count_, id_, 
ratio_to_report(count_) over() as percentage 
from your_table 

Results:

| COUNT_ | ID_ |   PERCENTAGE | 
|--------|-----|---------------------| 
|  10 | 1 | 0.16666666666666666 | 
|  20 | 2 | 0.3333333333333333 | 
|  30 | 4 |     0.5 | 
0

Функции окна обеспечивают наилучшее решение этой проблемы. То, что вы пытаетесь достичь, - это два уровня агрегации в одном запросе таблицы.

select id 
     ,count(*) 
     ,sum(count(*)) over() as CountOfAll 
     ,(1.0 * count(*))/sum(count(*)) over() as Pct 
from some_table 
group by id 

В тех случаях, когда знаменатель может привести к нулю, вы должны обернуть расчет рСТ в сазе, чтобы избежать деления на ноль ошибок:

select id 
    ,count(*) 
    ,sum(count(*)) over() as CountOfAll 
    ,case when sum(count(*)) over() = 0 
     then 0 
     else (1.0 * count(*))/sum(count(*)) over() 
    end as Pct 
from some_table 
group by id 

Оконные функции открывают намного больше возможности для создания совокупных результатов в рамках одного запроса и являются достойным инструментом для добавления в ваш инструмент инструментов SQL!

Смежные вопросы