Azure CosmosDB sql объединение не возвращает результатов, когда дочерний элемент содержит пустой массив - PullRequest
0 голосов
/ 20 февраля 2020

у нас есть структура json ниже. Вложив массив объектов. Некоторые массивы могут быть пустыми.

[
{
    "adjustments": [
        {
            "id": "1_0000001",
            "clientID": 1,
            "adjustmentID": "0000001",
            "chargeID": "0000001",
            "dateOfEntry": "2019-01-29T00:00:00",
            "adjustmentAmount": 200
        }
    ],
    "payments": [
        {
            "id": "1_0000001",
            "clientID": 1,
            "paymentID": "0000001",
            "chargeID": "0000001",
            "dateOfDeposit": "2019-01-28T00:00:00",
            "dateOfEntry": "2019-01-29T00:00:00",
            "paymentAmount": 250,
        },
        {
            "id": "1_0000002",
            "clientID": 1,
            "paymentID": "0000002",
            "chargeID": "0000001",
            "dateOfDeposit": "2019-01-28T00:00:00",
            "dateOfEntry": "2019-01-29T00:00:00",
            "paymentAmount": 50,
        }
    ],
    "id": "1_0000001",
    "clientID": 1,
    "chargeID": "0000001",
    "encounterID": "0000001",
    "patientID": "1234567"
    "dateOfServiceBegin": "2019-01-20T00:00:00",
    "dateOfServiceEnd": "2019-01-20T00:00:00",
    "dateOfEntry": "2019-01-21T00:00:00",
    "location": "Main Campus",
    "chargeTotal": 500

},
{
    "adjustments": [],
    "payments": [],
    "id": "1_0000001",
    "clientID": 1,
    "chargeID": "0000001",
    "encounterID": "0000001",
    "patientID": "1234567"
    "dateOfServiceBegin": "2019-02-20T00:00:00",
    "dateOfServiceEnd": "2019-02-20T00:00:00",
    "dateOfEntry": "2019-02-21T00:00:00",
    "location": "Main Campus",
    "chargeTotal": 500
}
]

Я пытаюсь выполнить приведенный ниже запрос

SELECT udf.getMonthAndYearPart(c.dateOfEntry) as date, sum(p.paymentAmount) as paymentAmount , sum(c.chargeTotal) as chargeAmount , sum(a.adjustmentAmount) as adjustmentAmount FROM c
JOIN p IN c.payments 
JOIN a IN c.adjustments 
where c.dateOfEntry >= '2019-01-11T18:30:00.000Z' and c.dateOfEntry <= '2020-12-30T18:30:00.000Z' 
GROUP BY udf.getMonthAndYearPart(c.dateOfEntry)

Я ожидаю показанный ниже результат

[
    {
        "date": "January-2019",
        "paymentAmount": 300,
        "chargeAmount": 1000,
        "adjustmentAmount": 400
    },
    {
        "date": "February-2019",
        "chargeAmount": 500,
    }
]

Но я получил только первый объект

[
    {
        "date": "January-2019",
        "paymentAmount": 300,
        "chargeAmount": 1000,
        "adjustmentAmount": 400
    }
]

Что я могу сделать без объединения? Я хочу рассчитать сумму сумм дочерних объектов по группам по месяцам. Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Нашел решение сам. используя подзапросы и группировать по. ниже одного - запрос на случай, если это кому-нибудь понадобится.

Select sum(k.totalPaymentAmount) as totalPaymentAmount,sum(k.totalAdjustmentAmount) as totalAdjustmentAmount,sum(k.totalCharge) as totalCharge,k.date as date From (SELECT 
(SELECT value sum(c.paymentAmount) FROM c IN RevenueAnalytics.payments) as totalPaymentAmount,
(SELECT value sum(c.adjustmentAmount) FROM c IN RevenueAnalytics.adjustments) as totalAdjustmentAmount,
RevenueAnalytics.chargeTotal as totalCharge,
udf.getMonthAndYearPart(RevenueAnalytics.dateOfServiceBegin) as date
FROM RevenueAnalytics) k
Group BY k.date
0 голосов
/ 20 февраля 2020

В вашем случае вам необходимо выполнить LEFT JOIN в вашем запросе, чтобы включить случаи документов с пустыми корректировками или платежами. LEFT JOIN на данный момент не поддерживается, вы можете проголосовать этой теме , чтобы включить эту функцию. В то же время вы можете создать процедуру и выполнить два отдельных запроса, один из которых выполняется с использованием объединений, а другой - без использования объединений и фильтрации (условие where) для записей с массивом_длина 0 для корректировок и платежей, а затем агрегировать все результаты и результат.

...