我有一个如下所示的表,需要将JSON格式的数据返回到。

在下面添加表脚本。
CREATE TABLE [dbo].[TempStudentJsonData]
(
[StudentID] [int] NULL,
[subject] [varchar](500) NULL,
[result] [varchar](10) NULL
)
GO以下是测试数据。
INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result])
VALUES (506995, N'PHYSICS', N'Pass')
GO
INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result])
VALUES (506995, N'CHEMISTRY', N'Fail')
GO
INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result])
VALUES (506996, N'PHYSICS', N'Pass')
GO
INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result])
VALUES (506996, N'BIOLOGY', N'Pass' )
GO
INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result])
VALUES (506997, N'MATH', N'Pass')
GO从这个表中,我想生成一个JSON,如下所示
[
{
"506995": [
{
"subject": "Physics",
"result": "Pass"
},
{
"subject": "Chemistry",
"result": "Fail"
}
]
},
{
"506996" : [
{
"subject": "Physics",
"reason": "Pass"
},
{
"subject": "Biology",
"reason": "Pass"
}
]
},
{
"506997" : [
{
"subject": "Math",
"reason": "Pass"
}
]
}
]我们如何才能做到这一点?
谢谢
发布于 2022-06-24 14:30:19
不幸的是,Server不支持动态键,也不支持JSON_AGG (创建一个裸JSON数组)。因此,您需要使用STRING_AGG自己构建一些
SELECT '[' + STRING_AGG(sjd.json, ',') + ']'
FROM (
SELECT
json =
CONCAT(
'{"',
sjd.StudentID,
'":[',
STRING_AGG(j.json, ','),
']}'
)
FROM TempStudentJsonData sjd
CROSS APPLY (
SELECT
sjd.subject,
sjd.result
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) j(json)
GROUP BY
sjd.StudentID
) sjd;请注意,此版本相对于相关的自联接的好处是只扫描表一次。
输出:
[
{
"506995": [
{
"subject": "PHYSICS",
"result": "Pass"
},
{
"subject": "CHEMISTRY",
"result": "Fail"
}
]
},
{
"506996": [
{
"subject": "PHYSICS",
"result": "Pass"
},
{
"subject": "BIOLOGY",
"result": "Pass"
}
]
},
{
"506997": [
{
"subject": "MATH",
"result": "Pass"
}
]
}
]https://stackoverflow.com/questions/72744431
复制相似问题