[英]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;
查看下面的鏈接了解更多詳情。
我們可以在沒有子查詢的情況下使用 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.