2015-05-28 11 views
5

Oto bardzo podstawowe spojrzenie na mój stół. Mam kolumny 1 i 2 i trzeba wygenerować kolumnę 3. Kolumna 3 to po prostu suma kolumny Number dla wszystkich Name podzielona przez Number dla danego wiersza.Uzyskaj sumę kolumn i użyj do obliczenia procentu całkowitej (mySQL)

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

Walczę z tym, jak uzyskać sumę wiersza liczby i używać go jako wartości do obliczenia reszty.

EDYCJA: Zamierzam zrobić to jako pojedyncza kwerenda zamiast dwóch oddzielnych, jeśli to możliwe.

+0

Czy masz łączną sumę dwóch kolumn wcześniej? – SalmonKiller

+0

@SalmonKiller Nie, nie mam. To trudna część (dla mnie). Próbujesz uzyskać tę wartość, a następnie użyć jej wszystkich w jednym zapytaniu. – jonmrich

Odpowiedz

5

Wystarczy CROSS JOIN z SUM() z Number kolumna:

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

To działa dla mnie ... dzięki! Jedno pytanie. Jeśli chciałbym dodać klauzulę "WHERE" (np. "WHERE name =" Bob "'), gdzie by to poszło? Próbowałem umieścić go po 'FROM mytable', ale otrzymuję błędy. – jonmrich

+0

@jonmrich To zależy od tego, co chcesz filtrować. Czy jest to wiersz, do którego odnosi się słowo "SUMA"? Następnie musisz to zrobić w "SELECT" z 'CROSS JOIN'. W przeciwnym razie 'WHERE' musi zostać umieszczone * po *' CROSS JOIN'. –

+0

Jak możesz sobie wyobrazić, mój rzeczywisty stół jest o wiele bardziej skomplikowany. I wiele kolumn o tej samej nazwie (reprezentujących tę samą osobę) i muszę dodać każdą z tych instancji razem (np. Suma dla Boba) i podzielić to przez sumę kolumny "Liczba". To tutaj właśnie się rozkręcam. – jonmrich

3

Można go pobrać z podselekcji:

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

Gdybym robi to, bym zacznij od zapisania zmiennej, która mieści się w sumie, w następujący sposób:

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

Kiedyś miałem tej zmiennej, mogę uruchomić kwerendę, że dostał procent dla każdego wiersza tak:

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

Jeśli nie chcesz użyć zmiennej, można po prostu pojedynek podzapytanie w wyciągu select:

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

Oto przykład SQL Fiddle dla każdego podejścia.

+0

Nigdy nie pracowałem z przechowywaniem zmiennej. Jak długo jest przechowywany? Czy mogę przez to napisać? Czy muszę uruchamiać je w osobnych zapytaniach? Wiele pytań ... – jonmrich

+1

@jonmrich Są one, jeśli się nie mylę, uruchamiać osobno, co widzę teraz w twojej edycji, możesz tego nie chcieć. Jest bardziej przydatny w procedurze przechowywanej, w którą wierzę. Jeśli chodzi o czas przechowywania, nie jestem pewien. Może to być właśnie twoja obecna sekcja – AdamMc331

+1

Mam ... dobrą rzeczą znać przyszłość, nawet jeśli nie ma tu zastosowania. – jonmrich