Как использовать функции SUM aggragate в Azure Cosmos DB - PullRequest
0 голосов
/ 06 января 2020

Как описано в официальной документации , поддержка Cosmos Db SQL API для агрегатных функций. Однако я не смог найти ни одного достойного примера запроса, который выполняет агрегирование по многоуровневой структуре документа элементов. Это структура моих элементов контейнера Cosmos DB. Я использую SQL API

{
"id": "1",
"invoiceNo": "INV0001",
"date": "2019/12/20",
"userId": "cashier1",
"invoiceDetails": [
    {
        "itemName": "Item 1",
        "qty": 1,
        "unitPrice": 100,
        "lineTotal": 100
    },
    {
        "itemName": "Item 2",
        "qty": 3,
        "unitPrice": 200,
        "lineTotal": 600
    },
    {
        "itemName": "Item 6",
        "qty": 1,
        "unitPrice": 300,
        "lineTotal": 300
    }
],
"_rid": "h9Q6AKtS7i0BAAAAAAAAAA==",
"_self": "dbs/h9Q6AA==/colls/h9Q6AKtS7i0=/docs/h9Q6AKtS7i0BAAAAAAAAAA==/",
"_etag": "\"1500611a-0000-1800-0000-5e00fbd40000\"",
"_attachments": "attachments/",
"_ts": 1577122772

}

Я хочу получить сумму invoiceDetails.lineTotal, используя запрос SQL. Ваши ответы высоко ценятся

1 Ответ

1 голос
/ 06 января 2020

Использование SELECT ... FROM ... IN таким образом позволяет работать только с частью документа, в данном случае с массивом invoiceDetails.

Таким образом, этот запрос:

SELECT *
FROM a in c.invoiceDetails

Производит:

[
    {
        "itemName": "Item 1",
        "qty": 1,
        "unitPrice": 100,
        "lineTotal": 100
    },
    {
        "itemName": "Item 2",
        "qty": 3,
        "unitPrice": 200,
        "lineTotal": 600
    },
    {
        "itemName": "Item 6",
        "qty": 1,
        "unitPrice": 300,
        "lineTotal": 300
    }
]

Затем можно использовать SUM для суммирования элемента из массива.

SELECT SUM(a.lineTotal) AS SumLineTotal
FROM a in c.invoiceDetails

И получить:

[
    {
        "SumLineTotal": 1000
    }
]
...