7 votos

Agregando con el filtro attribute($currentfeature) en QGIS

Por qué no funciona el filtro (4ª variable pasada a la función de agregado) cuando intento utilizar en la calculadora de campos una expresión de este tipo:

aggregate('Layer', 'sum', "Field1" ,  "Field2" = attribute($currentfeature, 'Field2'))

Devuelve la suma total de "Field1" en lugar de aplicar el filtro. En la función agregada, dicho filtro parece ser siempre verdadero, mientras que por sí mismo, funciona.

¿No es posible utilizar expresiones basadas en características con la función de agregado, o puede funcionar si modifico la expresión?

7voto

Elliott Maynard Puntos 11

Resulta que el filtro que se pasa a la función de agregado siempre devuelve True para cualquier característica.

"Field2"  = attribute( $currentfeature, 'Field2')

En otras palabras, lo que tienes a la izquierda de la condición es lo mismo que tienes a la derecha.

¿Por qué?

Porque "Field2" obtiene el valor del campo Field2 para la función actual, y eso es exactamente lo que el attribute porque está pidiendo el valor del campo llamado 'Field2' (segundo parámetro) para la característica actual (primer parámetro: $currentfeature ).

Tenga en cuenta que la expresión del filtro sólo puede acceder a los campos y valores de la capa referenciada ( 'Layer' en tu ejemplo) y no de la capa en la que vas a almacenar los resultados.

Por lo tanto, es necesario pasar un filtro que no siempre evalúa a True o no tendrá ningún sentido aprobarla.

Ejemplo de filtros válidos (dependerá de los valores de sus campos, por supuesto):

"Field2" = 185
"Field2" = 'abc'
"Field2" = attribute( $currentfeature, 'Field3' )
"Field2" = "Field3"

0 votos

Entonces, ¿cómo podría agregar con tal filtro? Por ejemplo obteniendo la suma de todo el campo 1 filtrado por cada valor del campo 2, como podemos hacer con un sumif en excel, como por ejemplo sumif(A $2:A$ 40,A2,B $2:B$ 40) que se arrastraría de la línea 2 a la línea 40.

2 votos

Si lo consigo bien, puedes conseguirlo usando sum("Field1","Field2") . Esto llama a la función suma para Field1 agrupados por Field2 valores. Tenga en cuenta que en la pregunta original, usted estaba usando aggregate que pretende obtener valores de otras capas, mientras que sum(), count(), y similares, operan sobre la misma capa.

0 votos

Efectivamente, funciona. No tenía ni idea de que la función de suma tenía componentes de grupo y de filtro. Gracias.

1voto

Will Norris Puntos 560

Sustitución de $currentfeature con producirá el resultado que probablemente esté buscando. Así que su comando agregado se convertirá en: aggregate( 'Layer', 'sum', "Field1" , "Field2" = attribute( , 'Field2')) que le permite seguir agregando en base a otra capa, pero también filtrar en base a la capa actual a la que está accediendo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X