如何在 SQL 中使用 group by 生成 json 数据
How to generate json data with group by in SQL
我有一个table如下图
在下面添加 table 个脚本。
CREATE TABLE [dbo].[TempStudentJsonData](
[StudentID] [int] NULL,
[ClassID] [varchar](500) NULL,
[DocumentID] [int] NULL,
[DocumentChildID] [int] NULL,
[UploadedFileName] [varchar](500) NULL,
[documentname] [varchar](500) NULL
) ON [PRIMARY]
GO
以下为测试数据
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5055, 0, N'P1.pdf', N'PHYSICS')
GO
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5058, 0, N'C1.pdf', N'CHEMISTRY')
GO
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5066, 387654, N'B1.pdf', N'BIOLOGY')
GO
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5066, 387655, N'B2.pdf', N'BIOLOGY')
GO
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5151, 387656, N'H1.pdf', N'HISTORY')
GO
从这个table我想生成一个json如下所示
[
{
"StudentID": 506995,
"documents": [
{
"documentname": "PHYSICS",
"attachments": [
{
"attachmentname": "P1.pdf"
}
]
},
{
"documentname": "CHEMISTRY",
"attachments": [
{
"attachmentname": "C1.pdf"
}
]
},
{
"documentname": "BIOLOGY",
"attachments": [
{
"attachmentname": "B1.pdf"
},
{
"attachmentname": "B2.pdf"
}
]
},
{
"documentname": "HISTORY",
"attachments": [
{
"attachmentname": "H1.pdf"
}
]
}
]
}
]
我尝试使用以下查询
生成json
SELECT [StudentID],
(
SELECT documentname,
(
SELECT UploadedFileName as attachmentname
FROM TempStudentJsonData
FOR JSON PATH
) AS attachments
FROM TempStudentJsonData FOR JSON PATH
) AS documents
FROM TempStudentJsonData group by [DocumentID],[StudentID] FOR JSON PATH
得到如下结果
我如何才能只将所需的上传文件映射到相应的文档名称(将上传的文件分组到相应的文档名称或文档 ID)?请帮忙
..关联文件名(每个学生)的子查询,然后关联文件(每个学生和文件名)
SELECT st.[StudentID],
(
SELECT distinct dn.documentname,
(
SELECT uf.UploadedFileName as attachmentname
FROM TempStudentJsonData as uf
where uf.StudentId = dn.StudentId
and uf.DocumentId = dn.DocumentId
FOR JSON PATH
) AS attachments
FROM TempStudentJsonData as dn
where dn.StudentId = st.StudentId
FOR JSON PATH
) AS documents
FROM TempStudentJsonData as st
group by st.[StudentID] FOR JSON PATH
另一种可能的方法是使用 FOR JSON AUTO
和适当的连接。正如文档中的 mentioned 一样,当 ... 您指定 AUTO 选项时,JSON 输出的格式将根据 [=21] 中列的顺序自动确定=] 列表及其源表.
SELECT DISTINCT
students.StudentID,
documents.DocumentName,
attachments.UploadedFileName AS attachmentname
FROM TempStudentJsonData students
JOIN TempStudentJsonData documents ON students.StudentID = documents.StudentID
JOIN TempStudentJsonData attachments ON students.StudentID = documents.StudentID AND documents.DocumentID = attachments.DocumentID
FOR JSON AUTO
结果:
[
{
"StudentID":506995,
"documents":[
{
"DocumentName":"BIOLOGY",
"attachments":[
{"attachmentname":"B1.pdf"},
{"attachmentname":"B2.pdf"}
]
},
{
"DocumentName":"CHEMISTRY",
"attachments":[
{"attachmentname":"C1.pdf"}
]
},
{
"DocumentName":"HISTORY",
"attachments":[
{"attachmentname":"H1.pdf"}
]
},
{
"DocumentName":"PHYSICS",
"attachments":[
{"attachmentname":"P1.pdf"}
]
}
]
}
]
我有一个table如下图
在下面添加 table 个脚本。
CREATE TABLE [dbo].[TempStudentJsonData](
[StudentID] [int] NULL,
[ClassID] [varchar](500) NULL,
[DocumentID] [int] NULL,
[DocumentChildID] [int] NULL,
[UploadedFileName] [varchar](500) NULL,
[documentname] [varchar](500) NULL
) ON [PRIMARY]
GO
以下为测试数据
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5055, 0, N'P1.pdf', N'PHYSICS')
GO
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5058, 0, N'C1.pdf', N'CHEMISTRY')
GO
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5066, 387654, N'B1.pdf', N'BIOLOGY')
GO
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5066, 387655, N'B2.pdf', N'BIOLOGY')
GO
INSERT [dbo].[TempStudentJsonData] ([StudentID], [ClassID], [DocumentID], [DocumentChildID], [UploadedFileName], [documentname]) VALUES (506995, N'CLASS-X', 5151, 387656, N'H1.pdf', N'HISTORY')
GO
从这个table我想生成一个json如下所示
[
{
"StudentID": 506995,
"documents": [
{
"documentname": "PHYSICS",
"attachments": [
{
"attachmentname": "P1.pdf"
}
]
},
{
"documentname": "CHEMISTRY",
"attachments": [
{
"attachmentname": "C1.pdf"
}
]
},
{
"documentname": "BIOLOGY",
"attachments": [
{
"attachmentname": "B1.pdf"
},
{
"attachmentname": "B2.pdf"
}
]
},
{
"documentname": "HISTORY",
"attachments": [
{
"attachmentname": "H1.pdf"
}
]
}
]
}
]
我尝试使用以下查询
生成jsonSELECT [StudentID],
(
SELECT documentname,
(
SELECT UploadedFileName as attachmentname
FROM TempStudentJsonData
FOR JSON PATH
) AS attachments
FROM TempStudentJsonData FOR JSON PATH
) AS documents
FROM TempStudentJsonData group by [DocumentID],[StudentID] FOR JSON PATH
得到如下结果
我如何才能只将所需的上传文件映射到相应的文档名称(将上传的文件分组到相应的文档名称或文档 ID)?请帮忙
..关联文件名(每个学生)的子查询,然后关联文件(每个学生和文件名)
SELECT st.[StudentID],
(
SELECT distinct dn.documentname,
(
SELECT uf.UploadedFileName as attachmentname
FROM TempStudentJsonData as uf
where uf.StudentId = dn.StudentId
and uf.DocumentId = dn.DocumentId
FOR JSON PATH
) AS attachments
FROM TempStudentJsonData as dn
where dn.StudentId = st.StudentId
FOR JSON PATH
) AS documents
FROM TempStudentJsonData as st
group by st.[StudentID] FOR JSON PATH
另一种可能的方法是使用 FOR JSON AUTO
和适当的连接。正如文档中的 mentioned 一样,当 ... 您指定 AUTO 选项时,JSON 输出的格式将根据 [=21] 中列的顺序自动确定=] 列表及其源表.
SELECT DISTINCT
students.StudentID,
documents.DocumentName,
attachments.UploadedFileName AS attachmentname
FROM TempStudentJsonData students
JOIN TempStudentJsonData documents ON students.StudentID = documents.StudentID
JOIN TempStudentJsonData attachments ON students.StudentID = documents.StudentID AND documents.DocumentID = attachments.DocumentID
FOR JSON AUTO
结果:
[
{
"StudentID":506995,
"documents":[
{
"DocumentName":"BIOLOGY",
"attachments":[
{"attachmentname":"B1.pdf"},
{"attachmentname":"B2.pdf"}
]
},
{
"DocumentName":"CHEMISTRY",
"attachments":[
{"attachmentname":"C1.pdf"}
]
},
{
"DocumentName":"HISTORY",
"attachments":[
{"attachmentname":"H1.pdf"}
]
},
{
"DocumentName":"PHYSICS",
"attachments":[
{"attachmentname":"P1.pdf"}
]
}
]
}
]