4

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.

1
  • 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
    Commented Oct 25, 2018 at 9:30

1 Answer 1

4

I don't have QGIS on hand to try right now but I believe @parent returns a feature, so you want it as 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

3
  • 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.
    – user39790
    Commented Oct 25, 2018 at 6:44
  • using QGIS 3.6 it works
    – PieterB
    Commented Apr 13, 2019 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
    Commented Apr 13, 2019 at 11:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.