запрос couchbase возвращает высокое значение суммы - PullRequest
1 голос
/ 17 июня 2020

Мой документ содержит 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

У меня есть следующий запрос, который возвращает правильную общую стоимость покупки для каждого типа группы участников но 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;

1 Ответ

2 голосов
/ 17 июня 2020

Когда JOIN каждая Левая сторона может произвести 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;
...