Вы можете заменить этот фрагмент:
WITH path, PDP, sum(PDP) AS DWPC
RETURN
path,
PDP,
100 * (PDP / DWPC) AS PERCENT_OF_DWPC
ORDER BY PERCENT_OF_DWPC DESC
с этим:
WITH path, collect(PDP) AS pdps, sum(PDP) AS DWPC
UNWIND pdps AS PDP
RETURN
path,
PDP,
100 * (tofloat(PDP) / DWPC) AS PERCENT_OF_DWPC
ORDER BY PERCENT_OF_DWPC DESC
Исходное предложение WITH
имеет 2 "ключа группировки", path
и PDP
, поэтому агрегирующая функция sum()
будет суммироваться по разным парам path
и PDP
( другими словами, он будет использовать только один PDP
в каждой сумме), что не соответствует вашим ожиданиям.
В новом предложении WITH
добавлено использование функции агрегирования collect()
для сбора всех значений PDP
. Поскольку в этом новом предложении теперь есть только один неагрегирующий термин, path
, этот термин используется как полный ключ группировки (для обеих функций). Это приводит к тому, что функция sum()
фактически суммирует по всем PDP
значениям для одного и того же path
. Предложение UNWIND
затем используется для разделения отдельных значений PDP
. Кроме того, я предполагаю, что PDP
является целым числом, поэтому функция tofloat()
используется для гарантии того, что деление не выполняет целочисленное усечение.
[UPDATE]
Если вам действительно нужно вычислить сумму DWPC
по всем path
значениям, то новый фрагмент кода должен быть немного более сложным:
WITH path, collect(PDP) AS pdps, sum(PDP) AS sum1
WITH collect({path: path, pdps: pdps}) AS allData, sum(sum1) AS DWPC
UNWIND allData AS data
UNWIND data.pdps AS PDP
RETURN
data.path AS path,
PDP,
100 * (tofloat(PDP) / DWPC) AS PERCENT_OF_DWPC
ORDER BY PERCENT_OF_DWPC DESC