如何在 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"}
            ]
         }
      ]
   }
]