2016-08-23 3 views
0

eine einfache Gruppe von Abfrage vor:Compute-Verhältnis von Gruppengrößen unter Verwendung von SQL

select foo, count(*) 
    from mytable where bar=10 
group by foo 

Dieses eine Tabelle zurückgibt, die die folgende Form besitzt:

foo | count 
----+------ 
a | 100 
b | 200 
c | 300 

Mein Ziel ist es zu bekommen, eine einzige mit fragen Sie die folgende Tabelle:

foo | count | ratio 
----+-------+------- 
a | 200 | 18.2 
b | 300 | 27.3 
c | 600 | 54.5 

In der Praxis habe ich mehr mögliche Werte von foo somit Antworten wie die in here sind nicht hilfreich. Außerdem nicht, dass das Verhältnis gerundet und mit 100 multipliziert wird.

Was ist die beste Vorgehensweise, dies zu tun?

Antwort

2

Klingt wie Sie so etwas wie dies wollen:

select foo, count(*), 
     count(*) * 100.0/sum(count(*)) over() as ratio 
from mytable 
where bar = 10 
group by foo; 

Dies garantiert nicht, dass der Wert auf genau 100% bis hinzufügt, wenn abgerundet. Das ist ein großes Tricker-Problem, das normalerweise auf der Anwendungsebene besser gehandhabt wird. Dies erzeugt die "richtige" Antwort unter Verwendung von Gleitkommazahlen.

+0

Ihre Lösung hier oben ist einfach falsch! Ich habe Ihren Code ausgeschnitten und eingefügt (auch wenn er nicht wirklich benötigt wird - Sie müssen ihn nur lesen) und erzeugt falsche Ergebnisse. Hast du versucht, es auszuführen? – mauro

0

Hier ist ein funktionierendes Beispiel, das seine eigenen Daten entlang schleppt - die Sie auf Ihre individuellen Bedürfnisse anpassen können:

SQL>WITH mytable(
    ...>foo , counter 
    ...>) AS (
    ...>   SELECT 'a',200 
    ...>UNION ALL SELECT 'b',300 
    ...>UNION ALL SELECT 'c',600 
    ...>) 
    ...>SELECT 
    ...> foo 
    ...>, counter 
    ...>, (counter * 100.0/SUM(counter) OVER())::NUMERIC(3,1) AS ratio 
    ...>FROM mytable 
    ...>; 
    foo|counter    |ratio 
    a |     200| 18.2 
    b |     300| 27.3 
    c |     600| 54.5 
    select succeeded; 3 rows fetched 

Glückliches Spiel ... marcothesane

Verwandte Themen