2012-12-05 16 views
10

Ho la seguente domanda. E il risultato è rendimenti sono molto inaspettata:Oracle: come ottenere la percentuale del totale da una query?

select stato, (count(1) *100)/sum(1) 
from LOG_BONIFICA 
group by stato; 

restituisce 100 per tutte le righe

+1

Cosa ti aspetti? – nhahtdh

+0

specifica il nome della colonna in count() e sum() .. –

+0

@ Gik25: prova con 'select stato, count (1), sum (1)' nella tua query, poi saprai perché stai ricevendo il 100 per ogni riga. E puoi dirci cosa ti aspetti dal conteggio (1) e dalla somma (1) –

risposta

40

count(1) è pari a sum(1) nel tuo caso.

provare qualcosa di simile:

18:39:36 [email protected]> ed 
Wrote file S:\\tools\buffer.sql 

    1 select owner, 
    2   count(*) group_cnt, 
    3   sum(count(*)) over() total_cnt, 
    4   round(100*(count(*)/sum(count(*)) over()),2) perc 
    5 from dba_objects 
    6 group by owner 
    7* order by 4 desc 
18:39:57 [email protected]>/

OWNER       GROUP_CNT TOTAL_CNT  PERC 
------------------------------ ---------- ---------- ---------- 
SYS         31609  59064  53.52 
PUBLIC        24144  59064  40.88 
XDB         1660  59064  2.81 
SYSTEM        597  59064  1.01 
WMSYS         332  59064  .56 
EXFSYS        312  59064  .53 
IRKAZDATA        158  59064  .27 
STRMADMIN        92  59064  .16 
DBSNMP         55  59064  .09 
RI          25  59064  .04 
PASS         16  59064  .03 
POTS         19  59064  .03 
TI          11  59064  .02 
STRMODS        11  59064  .02 
OUTLN         10  59064  .02 
APPQOSSYS        5  59064  .01 
ORACLE_OCM        8  59064  .01 

17 rows selected. 

Elapsed: 00:00:00.16 

aggiornamento: o anche più semplice con ratio_to_report

18:53:36 [email protected]> ed 
Wrote file S:\\tools\buffer.sql 

    1 select owner, 
    2   round(100*ratio_to_report(count(*)) over(), 2) perc 
    3 from dba_objects 
    4 group by owner 
    5* order by 2 desc 
18:54:03 [email protected]>/

OWNER        PERC 
------------------------------ ---------- 
SYS         53.52 
PUBLIC        40.88 
XDB         2.81 
SYSTEM        1.01 
WMSYS         .56 
EXFSYS        .53 
IRKAZDATA        .27 
STRMADMIN        .16 
DBSNMP        .09 
RI         .04 
PASS         .03 
POTS         .03 
TI         .02 
STRMODS        .02 
OUTLN         .02 
APPQOSSYS        .01 
ORACLE_OCM       .01 

17 rows selected. 

Elapsed: 00:00:00.20 
+0

super risposta !!! quindi +1 – vijikumar

+0

+1 questo è bello ed è in oracolo. Grande. – bonCodigo

2

Si riferisce al seguente? Hai bisogno di trovare il totale alcuni separatamente.

Tabella:

ID NAME AMOUNT STATE 
1 john 1000 fl 
2 jane 5000 ga 
3 james 2000 ca 
4 tom  6000 ga 
5 tim  8000 fl 
6 jim  2000 ga 
7 kate 8000 fl 
8 jack 3000 tx 

Risultati 1:

STATE SUM(AMOUNT) 
ca  2000 
fl  17000 
ga  13000 
tx  3000 

query finale:

select t1.state, concat(
    round(((sum(t1.amount)/t2.total))*100,2), 
'%') as pct 
from t1, 
(select sum(amount) as total from t1) as t2 
group by t1.state 
; 

Risultati:

STATE COUNT(T1.ID) SUM(T1.AMOUNT) TOTAL PCT 
    ca  1    2000   35000 5.71% 
    fl  3    17000   35000 48.57% 
    ga  3    13000   35000 37.14% 
    tx  1    3000   35000 8.57% 
0

Usa ratio_to_report funzione analitica:

SELECT STATO, 
    COUNT(1) STATO_COUNT, 
    RATIO_TO_REPORT(COUNT(1)) OVER() * 100 STATO_PERCENT 
FROM LOG_BONIFICA 
GROUP BY STATO 

quindi non hanno bisogno di calcolare conteggio delle righe totale e il rapporto di te stesso.

Problemi correlati