[GIS] Referring to the parent layer with aggregate functions in QGIS

aggregationqgis

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.

Best Answer

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