3

I'm trying to find how to refer to a field of a parent layer as a filter for an aggregate function. The instructions specify that the parent layer can be referred to with the variable @parent, but I've tried all manner of combinations and can't seem to get any to work.

The formula is;

aggregate(layer:='{my child layer}',aggregate:='sum',expression:="{a field from the child layer}",filter:="{a field from the parent layer}">1000)

Obviously, the field from the parent layer also appears in the child layer (otherwise the filter wouldn't work), but I want to build an expression which will iterate over several rows in the parent layer, each of which is a particular field in the child layer.

So far, I've tried replacing "{a field from the parent layer}" with;

@parent "{field}" "{field}"@parent "{field}@parent" "{field}(@parent)"

...and probably a half-dozen other combinations of parentheses, quotes and orders.

The example simply uses 'geometry(@parent)', is it not possible with anything other than geometry?


Just in case the above doesn't make sense, or anyone can think of an alternative method, what I'm trying to do (in a simple example), would be if say one layer 'countries' had the fields "area", "urban population", "rural population", and "adult population". In each row is a different country.

In another layer 'summary', there are the fields "field", and "total areas". Each row is a field from the 'countries' layer.

I want the total areas column to add up the the total areas from 'countries' where those countries relevant populations are over 1000. So "total areas" for the row 'urban population' would show the total are of all countries where the urban population was over 1000, but "total areas" in the row 'rural population' would show the total area of all countries where the rural population was over 1000.

In the more complex real world problem I'm working on, there are 36 rows in the 'summary' table (36 fields to summarise from the child layer), and 9 measurements (in addition to area) to summarise. So writing a single query for each summary (360 of them) is just not an option.

  • Within aggregate(), if you call the first part layer:={my parent layer} instead of child, it will become more apparent and easily understood. You can access to any parent field just by " field " without @parent. – Kazuhito Oct 25 '18 at 9:30
2

I don't have QGIS on hand to try right now but I beljeve @parent returns a feature, so you want it as a a parameter for a function that takes a feature as input (e.g. geometry(<feature>)).

How about attribute()? You could try filter:=attribute(@parent,'field')>1000 - keep in mind the name of the field is in single quotes and case-sensitive here. IIRC.

EDIT: This only works in QGIS 3.x as @parent is not available in 2.x

  • 1
    Thanks for the idea. Unfortunately it's not working either. I'm not sure what value '@parent' is calling here, but it's not filtering anything, basically the formula just gives the total, unfiltered value. I've tried putting '@parent' in a variety of different places within the attribute expression but so far to no avail. – Isaacson Oct 25 '18 at 6:44
  • using QGIS 3.6 it works – PieterB Apr 13 at 11:09
  • Sorry @Isaacson I don't know how I missed your comment before. I should have added that this expression only works in Q 3.x and above. Answer now edited. – she_weeds Apr 13 at 11:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.