2016-11-22 3 views
-1

Мне нужно вычислить процент комбинации одной группы, у меня есть что-то вроде этогоВычислить процент по группам

c1  c2 Month  Sol   Amnt 

---  --- ------ ------  ------- 
AA  BA April  F   123 
AA  BA April  A   45 
AA  BA April  N   576 
AB  AS April  F   12 
AB  AS April  A   20 
AA  BA March  F   34 
AA  BA March  N   15 
AA  BA March  A   10 

И мне нужен выход, чтобы быть что-то вроде этого

c1  c2  Month Sol  Amnt  Total  % 

---- ---- ------- ----  ------  ------ ------- 
AA  BA  April  F   123  744  16.53% 
AA  BA  April  A   45   744  6.05% 
AA  BA  April  N   576  744  77.42% 
AB  AS  April  F   12   32  37.50% 
AB  AS  April  A   20   32  62.50% 
AC  BA  March  F   34   59  57.63% 
AC  BA  March  N   15   59  25.42% 
AC  BA  March  A   10   59  16.95% 
+1

объясняющие лучше у наш вопрос – scaisEdge

+0

У меня есть несколько комбинаций значений, которые повторяются на C1 и C2, и я хочу рассчитать их процент на основе C1 & C2 combo в зависимости от месяца – Zombraz

+0

Вы должны отредактировать исходный вопрос и опубликовать SQL, который у вас есть на данный момент , и лучше объяснить вопрос. – BobNoobGuy

ответ

0

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

select c1, c2, month, sol, Amnt 
, sum(amnt) over(partition by c1,c2, month order by c1, c2) Total 
, round((amnt/sum(amnt) over(partition by c1,c2, month order by c1,c2))*100,2)||'%' "%" 
from TBL1; 

магия часть над (раздел ... применен к любой агрегации.

сумма (AMNT) над (раздел по c1, c2, месяц порядка по c1, c2) Всего

Результаты: enter image description here

+0

Он отлично работал !!!! Большое спасибо! – Zombraz

+0

@Zombraz Приятно слышать, как это работает, и тогда этот ответ должен быть отмечен как принятый. – Ftaveras

0
CREATE TABLE TBL1 
(
    c1 VARCHAR(20) 
, c2 VARCHAR(20) 
, Month VARCHAR(20) 
, Sol VARCHAR(20) 
, Amnt integer 
); 


    insert INTO tbl1 (c1,c2,Month,Sol,Amnt) values ('AA','BA','April','F',123); 
    insert INTO tbl1 (c1,c2,Month,Sol,Amnt) values ('AA','BA','April','A',45); 
    insert INTO tbl1 (c1,c2,Month,Sol,Amnt) values ('AA','BA','April','N',576); 
    insert INTO tbl1 (c1,c2,Month,Sol,Amnt) values ('AB','AS','April','F',12); 
    insert INTO tbl1 (c1,c2,Month,Sol,Amnt) values ('AB','AS','April','A',20); 
    insert INTO tbl1 (c1,c2,Month,Sol,Amnt) values ('AC','BA','March','F',34); 
    insert INTO tbl1 (c1,c2,Month,Sol,Amnt) values ('AC','BA','March','N',15); 
    insert INTO tbl1 (c1,c2,Month,Sol,Amnt) values ('AC','BA','March','A',10); 



SELECT 
    Tbl1.* 
    ,Grp.ttlAmt 
    ,Tbl1.Amnt/Grp.ttlAmt * 100 
FROM 
    TBL1 
    left join ( 
    select c1 , sum(amnt) as ttlAmt from Tbl1 group by c1)Grp 
    on Grp.c1 = Tbl1.C1 

Added SQLfiddle link http://sqlfiddle.com/#!2/0ac79/2

+0

TY Bob! Но я собираю информацию из другого набора подзапросов, и он, похоже, не работает, это мой код. – Zombraz

+0

сообщение, что у вас есть – BobNoobGuy

+0

@Zombraz Я добавил ссылку SqlFiddle для вас – BobNoobGuy

0

Добавьте это в свою запрос:

TO_CHAR((amnt/total)*100||'%' as "%" 
0

Вы можете использовать ту же таблицу, сгруппированные по различным Leve агрегации

select c1, c2, Month, Sol, Tot_Sol_Amnt, Tot_Amnt, (Tot_Sol_Amnt/Tot_Amnt)*100 as perc 
from (
select t2.c1 as c1, t2.c2 as c2, t2.Month as Month, t2.Sol as Sol, sum(t2.Amnt) as Tot_Sol_Amnt 
     from tbl1 t2 
     group by t2.c1, t2.c2, t2.Month, t2.Sol 
) tt1 inner join (
select t1.c1, t1.c2, t1.Month, sum(t1.Amnt) Tot_Amnt 
     from tbl1 t1 
     group by t1.c1, t1.c2, t1.Month 
) tt2 on tt1.c1 = tt2.c1 AND tt1.c2 = tt2.c2 AND tt1.month = tt2.month 

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

  • Нет связанных вопросов^_^