Как агрегировать JSON в SQL Server? - PullRequest
0 голосов
/ 08 апреля 2019

Я изучил документацию по SQL Server, но не нашел ничего похожего на JSON-агрегат. Это структура моей таблицы.

| Column Name         | Type               | Nullable | Properties | Description |
| ------------------- | ------------------ | -------- | ---------- | ----------- |
| employee_id         | INT(4)             | NO       |            |             |
| first_name          | NVARCHAR(100)      | NO       |            |             |
| last_name           | NVARCHAR(100)      | NO       |            |             |
| department_id       | INT(4)             | NO       |            |             |
| date                | DATETIMEOFFSET(10) | NO       |            |             |

То, что я ожидаю, это:

{
    department_id: 1,
    count: 2,
    employees: [
    {
        first_name: 'John',
        last_name: 'Doe'
        employee_id: 1
    },
    {
        first_name: 'Foo',
        last_name: 'Bar',
        employee_id: 2
    }]
}

Из этого запроса я смог получить этот результат.

SELECT
    ves.department_id,
    COUNT(1) AS count,
    (SELECT
         a.first_name,
         a.last_name,
         a.employee_id
     FROM 
         employee_departments a
     WHERE 
         a.department_id = ves.department_id 
     FOR JSON AUTO) AS employees
FROM 
    employee_departments ves
GROUP BY 
    ves.department_id;

Но мне интересно, есть ли лучший подход к агрегированию JSON? совсем как STRING_AGG()?

SELECT
    department_id,
    COUNT(1) as count,
    STRING_AGG(employee_id, ',')
FROM 
    employees_shifts 
GROUP BY 
    department_id;

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Я провел небольшое исследование и нашел несколько примеров для преобразования реляционных данных в JSON.Еще один способ достижения этого результата - FOR JSON AUTO:

SELECT DISTINCT
  ed.department_id,
  employees.id,
  employees.first_name,
  employees.last_name
FROM
  employees_departments ed
INNER JOIN
  employees_departments employees
ON
  ed.department_id = employees.department_id
ORDER BY ed.department_id, employees.id
FOR JSON AUTO;

Для получения более подробной информации перейдите по ссылке ниже.

https://www.mssqltips.com/sqlservertip/5348/advanced-techniques-to-transform-relational-data-to-json-in-sql-server-2016/

0 голосов
/ 08 апреля 2019

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

a таблица макетов

DECLARE @tbl TABLE(department_id INT,employee_id INT,first_name VARCHAR(100),last_name VARCHAR(100));
INSERT INTO @tbl VALUES
 (1,1,'John','Doe')
,(1,2,'Foo','Bar')
,(2,3,'some','more');

- запрос

SELECT
    ves.department_id,
    COUNT(1) AS count,
    (SELECT
         a.first_name,
         a.last_name,
         a.employee_id
     FROM 
         @tbl a
     WHERE 
         a.department_id = ves.department_id 
     FOR JSON PATH) AS employees
FROM 
    @tbl ves
GROUP BY 
    ves.department_id
FOR JSON PATH;

Результат

[
    {
        "department_id": 1,
        "count": 2,
        "employees": [
            {
                "first_name": "John",
                "last_name": "Doe",
                "employee_id": 1
            },
            {
                "first_name": "Foo",
                "last_name": "Bar",
                "employee_id": 2
            }
        ]
    },
    {
        "department_id": 2,
        "count": 1,
        "employees": [
            {
                "first_name": "some",
                "last_name": "more",
                "employee_id": 3
            }
        ]
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...