2017-02-02 1 views
0

J'ai reçu d'un sélectionnez requête ce genre de tableau (juste un exemple simple):Comment puis-je ajouter une colonne avec des valeurs spécifiques et calculer le pourcentage?

D   C   Letter 
20153  200  x 
20154  300  x 
20161  250  x 
20162  180  x 
20153  500  y 
20154  380  y 
20161  550  y 
20162  170  y 
20153  230  z 
20154  700  z 
20161  210  z 
20162  185  z 

, la colonne D répète après quatre entrées. C est toujours différent et la lettre change après quatre entrées. Au total, 20153 a 100.000, 20154 a 150.000, 20161 a 300.000 et 20162 a 250.000 entrées. Je voudrais mettre ces valeurs aux chiffres correspondants, calculer le pourcentage de sorte qu'il ressemble à ceci:

D   C   Letter Total  Perc 
20153  200  x   100.000 0.002 
20154  300  x   150.000 0.002 
20161  250  x   300.000 0.008 
20162  180  x   250.000 ... 
20153  500  y   100.000 ... 
20154  380  y   150.000 ... 
20161  550  y   300.000 ... 
20162  170  y   250.000 ... 
20153  230  z   100.000 ... 
20154  700  z   150.000 ... 
20161  210  z   300.000 ... 
20162  185  z   250.000 ... 

Comment puis-je faire cela? solutions fournies peuvent également être écrites dans R.

+5

SO est pas un code d'écriture * pour moi * service. S'il vous plaît montrer votre tentative jusqu'à présent. –

+0

S'il vous plaît ajouter un tag pour la base de données (Oracle/PostgreSQL/SQL Server/MySQL etc) + version –

+0

Eh bien, je l'ai essayé avec cbind jusqu'à la fin de ma df (1: nrow (df)) mais en quelque sorte il me donne une erreur . Probablement parce que j'ai quatre valeurs différentes au lieu d'une seule pour tous. – victoria14

Répondre

0

Vous devez définir quelque part Vos vecteurs donnés, par exemple dans la sous-requête V. La sous-requête X ajoute la colonne RN avec des lignes partitionnées par letter et classées par D. Maintenant, nous pouvons join ces deux requêtes et de faire la division:

with 
    v as (select 1 rn, 100000 as total from dual union all 
     select 2 rn, 150000 as total from dual union all 
     select 3 rn, 300000 as total from dual union all 
     select 4 rn, 250000 as total from dual), 
    x as (select t.*, row_number() over (partition by letter order by d) rn 
      from t) 
select rn, d, c, letter, total, cast(c/total as number(8, 5)) percent 
    from x join v using (rn) 
    order by letter, d 

données de test et de sortie:

create table t (d number(6), c number(6), letter varchar2(2)); 
insert into t values (20153, 200, 'x'); 
insert into t values (20154, 300, 'x'); 
insert into t values (20161, 250, 'x'); 
insert into t values (20162, 180, 'x'); 
insert into t values (20153, 500, 'y'); 
insert into t values (20154, 380, 'y'); 
insert into t values (20161, 550, 'y'); 
insert into t values (20162, 170, 'y'); 
insert into t values (20153, 230, 'z'); 
insert into t values (20154, 700, 'z'); 
insert into t values (20161, 210, 'z'); 
insert into t values (20162, 185, 'z'); 


    RN  D  C LETTER  TOTAL PERCENT 
----- ------- ------- ------ ---------- ---------- 
    1 20153  200 x   100000 0,00200 
    2 20154  300 x   150000 0,00200 
    3 20161  250 x   300000 0,00083 
    4 20162  180 x   250000 0,00072 
    1 20153  500 y   100000 0,00500 
    2 20154  380 y   150000 0,00253 
    3 20161  550 y   300000 0,00183 
    4 20162  170 y   250000 0,00068 
    1 20153  230 z   100000 0,00230 
    2 20154  700 z   150000 0,00467 
    3 20161  210 z   300000 0,00070 
    4 20162  185 z   250000 0,00074 
0

Cela fonctionne sur certaines bases de données

select  D,C,Letter 
      ,sum(C) over (partition by D)   as Total 
      ,C/sum(C) over (partition by D) * 100 as Perc 

from  mytable 

Si cela ne fonctionne pas sur votre base de données, effectuez les opérations suivantes

select  t.D,t.C,t.Letter 
      ,s.Total 
      ,t.C/c.Total * 100 as Perc 

from  mytable t 

      join (select  D,sum(C) as Total 
        from  mytable 
        group by D 
       ) s 

      on s.D = t.D 
+0

J'avais déjà essayé celui-ci, mais il me donne la mauvaise somme. Mon exemple est juste un extrait de ma table, ce qui signifie qu'il y a beaucoup plus de lignes. – victoria14

+0

Je l'ai déjà fixé par moi-même. – victoria14

+0

Comment votre premier commentaire se rapporte-t-il à cette solution? –