Vai al contenuto

Creare campo somma cumulativa

Aggiungere campo somma cumulativa

Siamo nella seguente ipotesi, una tabella ordinata per fid e un campo l che rappresenta delle lunghezze, come realizzare - usando il calcolatore di campi e le espressioni - un campo cum popolato con la somma cumulativa??

Ecco un esempio:

+-----+----+-----+
| fid | l  | cum |
+-----+----+-----+
| 1   | 0  | 0   |
| 2   | 10 | 10  |
| 3   | 20 | 30  |
| 4   | 30 | 60  |
| 5   | 40 | 100 |
| 6   | 50 | 150 |
+-----+----+-----+

Le soluzioni trovate sono più di una e dipende anche dalla versione di QGIS installata in quanto utilizza funzioni certamente presenti dalla 3.x in avanti.

Prima soluzione

Questa soluzione fa uso di funzioni presenti nel core di QGIS:

Nella maggior parte dei casi il primo record di un layer ha $id =1; in alcuni casi, per esempio gli shapefile, il primo record ha $id = 0, quindi la condizione di test di ifdovrebbe essere modificata di conseguenza affinché l'espressione funzioni come previsto:

if(
$id = 1, attribute($currentfeature, 'l'),
attribute($currentfeature, 'l') +
attribute(get_feature_by_id(@layer_name, $id-1), 'cum'))

Alternativamente si potrebbe usare, invece che la funzione $id, la variabile @row_number, in quanto quest'ultima dovrebbe iniziare sempre da 1 e quindi la seguente espressione dovrebbe funzionare in ogni caso :

if(
$id = 1, attribute($currentfeature, 'l'),
attribute($currentfeature, 'l') +
attribute(get_feature_by_id(@layer_name, @row_number-1), 'cum'))

NB: La somma cumulativa avviene in ordine per feature id, quindi i record del layer devono essere già intrinsecamente ordinati secondo l'ordine con cui si vuole che i valori vengano sommati.

Seconda soluzione

In questa soluzione valgono sempre gli Alert della prima, ma utilizzeremo altre funzioni come gli Array:

if(
$id = 1, array_agg( "l")[0],
eval(
replace(
array_to_string(
array_slice( array_agg( "l"),0,$id-1)), ',','+'))
)

Terza soluzione

In questa soluzione valgono sempre gli Alert della prima, ma utilizzeremo le funzioni del gruppo Array, in particolare la funzione array_sum presente in QGIS a partire dalla 3.18

if(
$id = 1, array_agg( "l")[0],
array_sum( array_slice( array_agg( "l"),0,$id-1))
)

Nello screenshot di sotto, i campi:

  • cum : è relativo al primo esempio;
  • cum_2 : è relativo al secondo esempio;
  • cum_3 : è relativo al terzo esempio.

Note finali

Il tutto è nato da qui