聚合函数,如使用相同 ( or ) 子句SUM
中的非聚合项作为“分组键”。因此,您的子句正在为每个不同的组合生成一个值。并且您的每个值都被调用。WITH
RETURN
WITH
SommeUnits
SommeUnits/ReordLevel
CREATE
SommeUnits
此查询应该可以正常工作(假设您希望每个返回的记录都具有相同的SommeUnits
值):
MATCH(p:Product) WHERE p.productName <> "TotalReord"
WITH SUM(p.unitsInStock) AS SommeUnits, COLLECT(p) AS ps
MERGE(t:Product {productName: "TotalReord"})
SET t.unitsInStock = SommeUnits
WITH ps, SommeUnits
UNWIND ps AS p
RETURN p.reorderLevel AS ReordLevel, p.supplierID AS Supplier, SommeUnits
ORDER BY ReordLevel
此查询用于MERGE
避免每次调用此查询时创建重复的“TotalReord”节点。并且该WHERE
子句过滤掉“TotalReord”节点,以便unitsInStock
在计算新总和时不会使用其现有值,从而对其进行膨胀。
如果您实际上希望每个返回的记录都具有该记录SommeUnits/ReordLevel
组合的总和,您可以这样做:
MATCH(p:Product) WHERE p.productName <> "TotalReord"
WITH SUM(p.unitsInStock) AS u, p.reorderLevel AS r, p.supplierID AS s
WITH COLLECT({u:u, r:r, s:s}) AS data, SUM(u) AS total
MERGE(t:Product {productName: "TotalReord"})
SET t.unitsInStock = total
WITH data
UNWIND data AS d
RETURN d.r AS ReordLevel, d.s AS Supplier, d.u AS SommeUnits
ORDER BY ReordLevel
[更新]
最后,如果您想执行前面的查询,但还想得到总和,这个查询将显示总和作为每条返回记录中的第四个值:
MATCH(p:Product) WHERE p.productName <> "TotalReord"
WITH SUM(p.unitsInStock) AS u, p.reorderLevel AS r, p.supplierID AS s
WITH COLLECT({u:u, r:r, s:s}) AS data, SUM(u) AS total
MERGE(t:Product {productName: "TotalReord"})
SET t.unitsInStock = total
WITH data, total
UNWIND data AS d
RETURN d.r AS ReordLevel, d.s AS Supplier, d.u AS SommeUnits, total
ORDER BY ReordLevel