couchbase 查询总和返回高值

couchbase query returning high value on sum

我的文档包含 183 个 Person 类型的文档和 2723 个 Purchase 类型的文档。基本上,一个人购买产品。示例文件如下。一个人可能从未购买过任何东西。

{"Type" : "Person", PersonID: 1, InitialFee: 100, "MemberGroupTypeID" : 1, _id:"Person_1_1"},
{"Type" : "Person", PersonID: 2, InitialFee: 200, "MemberGroupTypeID" : 1, _id:"Person_1_1"},
{"Type" : "Purchase", PersonID: 1, PurchaseID:1, Value: 5, "MemberGroupTypeID" : 1, _id:"Purchase_1_1_1"},
{"Type" : "Purchase", PersonID: 1, PurchaseID:2, Value: 10, "MemberGroupTypeID" : 1, _id:"Purchase_2_1_1"},
{"Type" : "Purchase", PersonID: 1, PurchaseID:3, Value: 25, "MemberGroupTypeID" : 1, _id:"Purchase_3_1_1"}

基本上,预期的输出是:

MemberGroupTypeID: 1, FeesTotal: 300, TotalPurchasesCost: 40

我有以下查询,其中 returns 更正了每种类型的会员组的总购买成本,但 FeesTotal 太高了,我不知道它是如何得到这个数字的。我的意思是,在 运行 查询之后,我无法发现预期数量与实际 FeesTotal 之间的关系:

SELECT SUM(person.InitialFee) AS FeesTotal,
SUM(purchase.Value) as TotalPurchasesCost,
person.MemberGroupTypeID
FROM bucket person
LEFT JOIN bucket purchase
ON person.MemberGroupTypeID= purchase.MemberGroupTypeID
WHERE person.Type = "Person" AND purchase.Type = "Purchase" AND
person.PersonId = purchase.PersonId
GROUP BY person.MemberGroupTypeID;

当JOIN时每个Left Side可以产生1:n。如果你聚合然后它计数多次。

通过首先对整个左侧文档进行分组然后对所需字段进行分组来使用二级聚合。

SELECT b.MemberGroupTypeID,
       SUM(b.InitialFee) AS FeesTotal,
       SUM(b.PurchasesCost) AS TotalPurchasesCost,
FROM (SELECT person.InitialFee,
             person.MemberGroupTypeID,
             SUM(purchase.`Value`) AS PurchasesCost
       FROM bucket AS person
       LEFT JOIN bucket AS purchase
       ON person.MemberGroupTypeID = purchase.MemberGroupTypeID
          AND purchase.Type = "Purchase" AND person.PersonId = purchase.PersonId
       WHERE person.Type = "Person"
       GROUP BY person) AS b
GROUP BY b.MemberGroupTypeID;