Obliczanie sumy części kolumny na podstawie innej kolumny za pomocą kalkulatora pola QGIS?

17

Chciałbym obliczyć sumę wartości w jednej kolumnie na podstawie wartości w innej kolumnie. Aby zilustrować moje pytanie, przesłałem zdjęcie poniżej. Druga kolumna składa się z kodów pocztowych, trzecia całkowita sprzedaż. Chciałbym wiedzieć, jaka jest łączna sprzedaż na kod pocztowy? Więc w tym przypadku:

Jaka jest suma kolumny trzeciej dla wartości kolumny drugiej 1023? Dane wyjściowe powinny być 4 (0+1+1+2+0). Suma za 1024to powinna wynosić 11,5 zgodnie z tą samą logiką.

Ponieważ jest to dość duży zestaw danych, chciałbym, aby kalkulator pola QGIS (lub inne narzędzie) obliczył nowe pole, które podaje całkowitą sprzedaż w kodzie pocztowym. Jak dotąd nie wydaje mi się, żeby działało i miałem nadzieję, że ktoś tutaj może mi pomóc.

Jak widać, brakuje niektórych wartości, czy jest to problem w obliczeniach? Być może warto wspomnieć, że jest to stół.

Przykład

Ammar
źródło
powinno być 3 (0 + 1 + 1 + 2 + 0)? naprawdę?
user7172

Odpowiedzi:

25

Aktualizacja: QGIS 2.18 (07/07/2017):

W kalkulatorze polowym można użyć funkcji agregującej,sum która pozwala zsumować wartości kolumny na podstawie wyrażenia. Możesz także opcjonalnie grupować i filtrować funkcje sumowania. W kalkulatorze polowym możesz po prostu użyć:

sum( "Sum", "Sales")

Który robi dokładnie to samo co metoda wykorzystująca wtyczkę GroupStats .



Oryginalny post: 02.03.2016

Użyj wtyczki GroupStats, którą może być konieczne pobranie z wtyczek> Zarządzaj i instaluj wtyczki .

Oto przykładowa warstwa wykorzystująca niektóre z pokazanych atrybutów:

Warstwa

Więc:

  1. Uruchom wtyczkę GroupStats , wybierz odpowiednie pola do zsumowania ( Salesdla wierszy; Sumdla wartości), a następnie kliknij Oblicz . Powinieneś zobaczyć wyniki pokazujące sumę każdej sprzedaży:

    Wtyczka GroupStats

  2. Zapisz wyniki jako plik .csv z paska narzędzi GroupStats:

    Eksportuj do csv

  3. Zaimportuj plik .csv z powrotem do QGIS, przeciągając go do interfejsu lub z paska narzędzi:

    Warstwa> Dodaj warstwę> Dodaj ograniczoną warstwę tekstową ( zwróć uwagę, że wartości są oddzielone średnikami )

  4. Zrobić przyłącza z shapefile i pliku .csv, dopasowując Salespola:

    Łączy się

  5. Plik shapefile powinien teraz zawierać wartości sumy z pliku .csv:

    Wyniki

Możesz, jeśli chcesz, kontynuować korzystanie z Save As...opcji w pliku kształtu i zapisać go jako nowy, aby zachować połączone pola.

Joseph
źródło
Byłoby pomocne, gdyby składnik kalkulatora pola tej odpowiedzi zawierał wiersze SQL, które grupują i / lub filtrują. @Joseph
eyerah
@eyerah - wyrażenie sum( "Sum", "Sales")używa "Sales"jako filtr grupowy, jeśli o to ci chodzi?
Joseph
1
O. Teraz to widzę. To miałem na myśli. Dzięki.
eyerah
11

W przypadku aktualizacji do najnowszej wersji QGIS 2.14 można używać warstw wirtualnych, tworząc instrukcję SQL, np .:

SELECT "MYTABLE"."MYID", Sum("MYTABLE"."SALES")  AS zip_sale /*:int*/
FROM "MYTABLE"
GROUP BY "MYTABLE"."ZIPCODE"

Interfejs wygląda następująco:

wprowadź opis zdjęcia tutaj

Możesz także użyć menedżera DB, w którym za przyciskiem sql znajduje się kreator zapytań:

wprowadź opis zdjęcia tutaj

Kolumny MYID można użyć do dołączenia zsumowanej sprzedaży z powrotem do głównej tabeli. Karta łączenia znajduje się w obszarze właściwości tabeli.

Spójrz na wizualny dziennik zmian QGIS podFeature: Virtual layers

Jakob
źródło
6

Można to zrobić następująco:

  • W tabeli atrybutów wybierz wybierz według funkcji. Wpisz „nazwa-kolumny” = 1023. Wszystkie pola o wartości 1023 są zaznaczone.
  • Przejdź do narzędzi wektorowych -> Narzędzia analityczne -> podstawowe statystyki. Wybierz warstwę i kolumnę ze sprzedażą. Pamiętaj, aby zaznaczyć pole wyboru „tylko wybrane wartości”. Suma zostanie wyświetlona w oknie wyników. Musisz to zapisać;)
  • powtórz kroki dla każdego kodu pocztowego
Miron
źródło
1
PS Brakujące wartości nie stanowią problemu.
Miron
Jest to proste i dobrze działające podejście. Jednak może to być bardzo czasochłonne podczas przetwarzania dużego zestawu danych, jak wspomniał Ammar ...
dru87