2015-05-28 10 views
5

Hier ist ein sehr einfacher Blick auf meine Tabelle. Ich habe Spalten 1 und 2 und muss Spalte 3 generieren. Spalte 3 ist einfach die Summe der Number Spalte für alle Name geteilt durch Number für die angegebene Zeile.Erhalten Spalte Summe und verwenden Sie, um Prozent der Gesamt (mySQL) zu berechnen

| Name   | Number  | % of total | 
| ------------- |:-------------:| -----:  | 
| Bob   | 5    | 25   | 
| Sally   | 10   | 50   | 
| John   | 5    | 25   | 

Ich kämpfe mit, wie die Summe der Zahlenreihe zu erhalten und nutzen, als ein Wert, den Rest zu berechnen.

EDIT: Ich freue mich, dies als eine einzige Abfrage anstelle von zwei separaten wenn möglich zu tun.

+0

Haben Sie vorher die Gesamtsumme der zweiten Spalten? – SalmonKiller

+0

@SalmonKiller Nein, tue ich nicht. Das ist der schwierige Teil (für mich). Versuchen, diesen Wert zu erhalten und dann alles in einer Abfrage zu verwenden. – jonmrich

Antwort

5

Sie müssen nur die SUM() von Number Spalte CROSS JOIN:

SELECT Name, Number, Number * 100/t.s AS `% of total` 
FROM mytable 
CROSS JOIN (SELECT SUM(Number) AS s FROM mytable) t 

Demo Here

+0

Das funktioniert für mich ... danke! Eine Frage. Wenn ich eine 'WHERE'-Klausel hinzufügen möchte (zB' WHERE name = "Bob" '), wohin würde das gehen? Ich habe versucht, es nach dem 'FROM Mistable' zu ​​setzen, aber Fehler bekommen. – jonmrich

+0

@jonmrich Es hängt davon ab, was Sie filtern möchten. Sind es die Zeilen, auf die 'SUMME' angewendet wird? Dann müssen Sie es in der 'SELECT' von' CROSS JOIN' machen. Andernfalls muss 'WHERE' nach * dem' CROSS JOIN' platziert werden. –

+0

Wie Sie sich vorstellen können, ist meine Tabelle eigentlich viel komplizierter. Ich mehrere Spalten mit dem gleichen Namen (die gleiche Person darstellt) und ich muss jede dieser Instanzen zusammen (z. B. die Summe für Bob) hinzufügen und diese durch die Summe der Spalte "Anzahl" teilen. Hier werde ich aufgehängt, denke ich. – jonmrich

3

Sie es mit einem subselect bekommen:

SELECT Name, Number, Number * 100/(select sum(Number) FROM MYTABLE) AS '% of total' 
FROM mytable 
3

Wenn ich dies tun würde, würde ich Beginnen Sie mit dem Speichern einer Variablen, die den Gesamtwert enthält:

SET @total := (SELECT SUM(number) FROM myTable); 

Sobald ich diese Variable hatte, konnte ich eine Abfrage, die den Prozentsatz für jede Zeile wie diese bekommen:

SELECT name, number, (number/@total) * 100 AS percentage 
FROM myTable; 

Wenn Sie eine Variable nicht verwenden möchten, können Sie einfach bewegen, dass Unterabfrage in der select-Anweisung:

SELECT name, number, (number/(SELECT SUM(number) FROM myTable)) * 100 AS percentage 
FROM myTable; 

Hier ein SQL Fiddle Beispiel mit jedem Ansatz.

+0

Ich habe noch nie mit dem Speichern einer Variablen gearbeitet. Wie lange ist es gespeichert? Kann ich darüber schreiben? Muss ich diese in separaten Abfragen ausführen? Viele Fragen ... – jonmrich

+1

@jonmrich Sie sind, wenn ich mich nicht täusche, getrennt zu laufen, was ich jetzt in deinem Schnitt sehe, magst du das nicht wollen. Es ist nützlicher in einer gespeicherten Prozedur, glaube ich. Soweit wie lange es gespeichert ist, bin ich mir nicht sicher. Es könnte nur Ihr derzeitiger Abschnitt sein – AdamMc331

+1

Got it ... gute Sache für die Zukunft zu wissen, obwohl auch wenn es hier nicht gilt. – jonmrich

Verwandte Themen