2016-11-22 4 views
-1

Ich brauche den Prozentsatz der Kombination aus einer Gruppe zu berechnen, ich habe so etwas wie diesesberechnen Prozentsatz von Gruppen

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 

Und ich brauche die Ausgabe so etwas wie dieses

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

besser erklären y unsere Frage – scaisEdge

+0

Ich habe mehrere Kombinationen von Werten, die auf C1 und C2 wiederholen, und ich möchte ihren Prozentsatz basierend auf der C1 & C2 Combo abhängig von dem Monat berechnen – Zombraz

+0

Sie sollten Ihre ursprüngliche Frage bearbeiten und die SQL, die Sie im Moment haben und erkläre die Frage besser. – BobNoobGuy

Antwort

0

Sie können analytische Funktionen verwenden, um sie Werte von Gruppe zu berechnen.

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; 

Die Magie Teil ist über (Partition ... auf jede Aggregation angewendet.

Summe (amnt) über (Partition durch c1, c2, Monat um von c1, c2 insgesamt)

Ergebnisse: enter image description here

+0

Es hat perfekt funktioniert !!!! Vielen Dank! – Zombraz

+0

@Zombraz Schön zu hören, es hat wie erwartet funktioniert, und dann muss diese Antwort als akzeptiert markiert werden. – 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 
zu sein

Hinzugefügt SQLfiddle link http://sqlfiddle.com/#!2/0ac79/2

+0

TY Bob! Aber ich sammle Informationen aus einem anderen Satz von Unterabfragen, und es scheint nicht zu funktionieren, es ist mein Code. – Zombraz

+0

posten was du bisher hast – BobNoobGuy

+0

@Zombraz Ich habe einen SqlFiddle Link für dich hinzugefügt – BobNoobGuy

0

Fügen Sie dies zu Ihrem query:

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

Sie können den gleichen Tisch mit verschiedenen leve Aggregations gruppiert verwenden

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 
Verwandte Themen