Forum QGIS

Pełna wersja: kalkulator pól kilka warunków
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Witam , mam problem z poprawnym i działającym zapisaniem warunku złożonego
Próbowałam tak:
( "ludn_liczb" <30000 )* 2
(30000< "ludn_liczb" <60000 )* 3
(60000< "ludn_liczb" <90000 )* 4
(90000< "ludn_liczb" <120000 )* 5

i tak:
( "ludn_liczb" <30000 )* 2
( "ludn_liczb" >30000 AND "ludn_liczb" <60000)* 3
itd.
i tak:
CASE WHEN "ludn_liczb" <30000 THEN 2 END
itd.
łącząc wyrażeniem AND , + , nie dając żadnego łącznika. Działa tylko po wpisaniu pierwszego warunku, jak dodam kolejny warunek to nie działa.

Będę wdzięczna za pomoc.
Też nie udało mi się znaleźć sposobu na połączenie iluś warunków w jeden ciąg wykonywalny, możesz ewentualnie aktualizować to samo pole kilka razy przy użyciu kalkulatora pól dla poszczególnych warunków, wpisywania w sumie tyle samo co jedna długa formuła Wink I tak dla pierwszego przypadku będzie:
CASE WHEN "ludn_liczb" < 30000 THEN "ludn_liczb"*2 END
I potem analogicznie:
CASE WHEN "ludn_liczb" > 30000 AND "ludn_liczb" <60000 THEN "ludn_liczb"*3 END
itd.
Ok, errata, jednak da się to zrobić jednym wyrażeniem i powinno być ok jak wpiszesz tak:
case when "ludn_liczb" <30000 then "ludn_liczb"*2 when "ludn_liczb" <60000 then "ludn_liczb"*3 when "ludn_liczb" <90000 then "ludn_liczb"*4 (itd. w zależności od liczby przedziałów) end
Dziękuję za pomoc, faktycznie spełnia kilka warunków ale coś jest nie tak ponieważ
jako wynik pojawiają się liczby 12, 9 i 4 zamiast 2,3 i 4.

Zachodzi sprzeczność ponieważ liczba np. 10000 spełnia wszystkie warunki tzn. jest zarówno ,30000 jak i <60000 jak i ,90000. Trzeba jakoś zastosować przedziały :
"ludn_liczb" <30000
30000 < "ludn_liczb" <60000
60000 < "ludn_liczb" <90000
Witam,

W tym wypadku zadziała wielokrotna kombinacja Wink warto by było pomyśleć o odpowiednim domykaniu przedziałów (np. <= zamiast < itp.) bo przy wartości równej 30000 - wynik będzie zerowy

Kod:
case when "ludn_liczb" <30000 then "ludn_liczb"*2 else
(case when "ludn_liczb" <60000 and "ludn_liczb" > 30000 then "ludn_liczb"*3 else
(case when "ludn_liczb" <90000 and "ludn_liczb" > 60000 then "ludn_liczb"*4 else
(case when "ludn_liczb" > 90000 and "ludn_liczb" < 120000 then "ludn_liczb"*5 end)end)end)end

Pozdrawiam
"Dziękuję za pomoc, faktycznie spełnia kilka warunków ale coś jest nie tak ponieważ
jako wynik pojawiają się liczby 12, 9 i 4 zamiast 2,3 i 4"
Zachodzi sprzeczność ponieważ liczba np. 10000 spełnia wszystkie warunki tzn. jest zarówno ,30000 jak i <60000 jak i ,90000. Trzeba jakoś zastosować przedziały"

Nie zachodzi sprzeczność, bo warunki się nawzajem wykluczają i powiedzmy przykładowe 10000 spełniając pierwszy warunek nie będzie już brane pod uwagę w drugim jak i każdym kolejnym warunku.

"W tym wypadku zadziała wielokrotna kombinacja Wink warto by było pomyśleć o odpowiednim domykaniu przedziałów (np. <= zamiast < itp.) bo przy wartości równej 30000 - wynik będzie zerowy"

Nie będzie zerowy, gdyż wtedy 30000 łapie się do drugiego przedziału, zamiana < na <= spowoduje tylko, iż wtedy 30000 będzie jeszcze w pierwszym przedziale zamiast w drugim. Jedyne co nie może być, to dwa domknięcia ze znakiem równości, czyli np. <=30000 i w następnym >=30000.
Niestety - dwa domknięcia spowodują error.

W tej sytuacji nie może coś przynależeć jednocześnie do dwóch przedziałów- musi przynależeć albo do pierwszego albo do drugiego:

1 - ludn<= 30000 , 2 - 60000>= ludn > 30000 (oczywiście czy to ma być do 1 czy do 2 przedziału łatwo zamienić)

Dlatego też jedynie jednostronne znaki wieksze/mniejsze bądź równe wchodzą w grę.
No oczywiście, że jak jedna wartość będzie należeć do dwóch zbiorów bądź do żadnego, to będzie błąd, to chyba logiczne, jednak w formule, którą podałem:
ludn <30000, <60000, <90000
błędu nie ma, można ten znak zamienić na <= celem przesunięcia granic przedziału o 1, ewentualnie ostatnią wartość trzeba by zmienić jakby chcieć: <90000 i ostatni >=90000
Cześć,

nie potrafię zgadnąć, jaki powinien być wynik tej operacji, ale np. zakładając, że to mają być liczby 2..5, to można spróbować tak:
Kod:
case
when "ludn_liczb" < 30000 then 2
when "ludn_liczb" < 60000 then 3
when "ludn_liczb" < 90000 then 4
else 5
end
Wynikiem ma być iloczyn wartości pola (w tym przypadku liczba ludności) i podanego współczynnika przy spełnieniu określonego warunku (gdy liczba ludności zawiera się w danym przedziale), dlatego po "then" trzeba powtórzyć "ludn_liczb" * (i tu wpisać współczynnik). Składnia podana wcześniej:
case when "ludn_liczb" <30000 then "ludn_liczb"*2 when "ludn_liczb" <60000 then "ludn_liczb"*3 when "ludn_liczb" <90000 then "ludn_liczb"*4 (itd. w zależności od liczby przedziałów) end
działa dobrze.
Stron: 1 2