簡體   English   中英

如何在 SQL 服務器中聚合 JSON?

[英]How to aggregate JSON in SQL Server?

我查看了 SQL 服務器文檔,但沒有找到類似 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;

你在評論中要求我詳細說明......好吧,你自己的代碼看起來非常接近你似乎需要的東西。 嘗試這個:

一個模型表

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
            }
        ]
    }
]

我做了一些研究,發現了幾個將關系數據轉換為 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/

我們可以在沒有子查詢的情況下使用 STRING_AGG 和 CONCAT function 獲得相同的結果

SELECT e.department_id,

Count(e.department_id),

Concat('[',String_agg(Concat('{first_name:"', e.last_name ,

'",last_name:"',e.last_name,'"}',

'",employee_id:"',e.employee_id,'"}'),','),']') AS employees

FROM employees e

JOIN employee_departments ed

ON e.employee_id=ed.employee_id

GROUP BY ed.department_id FOR json path,

root('root')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM