Как создать многоуровневый вывод json с помощью sql-запроса в SQL Server 2016?

Возможно ли создать многоуровневую строку json в SQL Server 2016? У меня есть такая таблица (пациента_данные):

Как создать многоуровневый вывод json с помощью sql-запроса в SQL Server 2016?

И что я хочу сделать, так это создать вывод строки json в SQL Server следующим образом:

{
  "patient":[
    {
      "key":"A",
      "data":[
        {
          "name":"Amy Farha",
          "colored":"darkred",
          "avatar_url":"https://s3.amazonaws.com/uifaces/faces/twitter/ladylexy/128.jpg",
          "subtitle":"Vice President",
          "patientid":"qweqweqeqeq"
        },
        {
          "name":"Anies",
          "colored":"darkblue",
          "avatar_url":"https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg",
          "subtitle":"Vice Chairman",
          "patientid":"avasdasdad"
        }
      ]
    },
    {
      "key":"B",
      "data":[
        {
          "name":"Bryan Adams",
          "colored":"darkgreen",
          "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
          "subtitle":"Reggae Man",
          "patientid":"avasdasdad"
        }
      ]
    },
      {
        "key":"D",
        "data":[
          {
            "name":"David dummy",
            "colored":"darkgreen",
            "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
            "subtitle":"Reggae Man",
            "patientid":"avasdasdad"
          }
        ]
      },
      {
        "key":"M",
        "data":[
          {
            "name":"Muhammad Adams",
            "colored":"darkgreen",
            "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
            "subtitle":"Reggae Man",
            "patientid":"avasdasdad"
          }
        ]
      },
      {
        "key":"T",
        "data":[
          {
            "name":"Tere",
            "colored":"darkgreen",
            "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
            "subtitle":"Reggae Man",
            "patientid":"avasdasdad"
          },
          {
            "name":"Tifanny",
            "colored":"darkblue",
            "avatar_url":"https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg",
            "subtitle":"Vice Chairman",
            "patientid":"avasdasdad"
          }
        ]
      },
      {
        "key":"X",
        "data":[
          {
            "name":"Xavier",
            "colored":"darkgreen",
            "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
            "subtitle":"Reggae Man",
            "patientid":"avasdasdad"
          }
        ]
      }
  ]
}

** ПРИМЕЧАНИЕ «клавиша» - это группировка по первой букве имени пациента.

Я пытаюсь использовать путь json, но не могу понять в многоуровневом случае. Надеюсь, кто-то может мне помочь

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
1 356
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте выполнить следующие запросы с FOR JSON PATH

-- test data
CREATE TABLE Patients(
  id int,
  name varchar(100)
)

INSERT Patients(id,name)VALUES
(11,'A Patient 11'),(12,'A Patient 12'),
(21,'B Patient 21'),
(31,'C Patient 31'),(32,'C Patient 32')

-- query 1
SELECT
  (
    SELECT
      k.[key],
      (SELECT p.id,p.[name] FROM Patients p WHERE LEFT(p.[name],1)=k.[key] FOR JSON PATH) [data]
    FROM
      (
        SELECT DISTINCT LEFT([name],1) [key]
        FROM Patients
      ) k
    ORDER BY k.[key]
    FOR JSON PATH
  ) patient
FOR JSON PATH

/*
[
    {"patient":[
            {"key":"A","data":[{"id":11,"name":"A Patient 11"},{"id":12,"name":"A Patient 12"}]},
            {"key":"B","data":[{"id":21,"name":"B Patient 21"}]},
            {"key":"C","data":[{"id":31,"name":"C Patient 31"},{"id":32,"name":"C Patient 32"}]}
        ]
    }
]
*/

-- query 2
SELECT
  k.[key] [patient.key],
  (SELECT p.id,p.[name] FROM Patients p WHERE LEFT(p.[name],1)=k.[key] FOR JSON PATH) [patient.data]
FROM
  (
    SELECT DISTINCT LEFT([name],1) [key]
    FROM Patients
  ) k
ORDER BY k.[key]
FOR JSON PATH    

/*
[
    {"patient":{"key":"A","data":[{"id":11,"name":"A Patient 11"},{"id":12,"name":"A Patient 12"}]}},
    {"patient":{"key":"B","data":[{"id":21,"name":"B Patient 21"}]}},
    {"patient":{"key":"C","data":[{"id":31,"name":"C Patient 31"},{"id":32,"name":"C Patient 32"}]}}
]
*/

Вы можете добавить WITHOUT_ARRAY_WRAPPER, чтобы удалить скобки [ и ]

SELECT
  (
    SELECT
      k.[key],
      (SELECT p.id,p.[name] FROM Patients p WHERE LEFT(p.[name],1)=k.[key] FOR JSON PATH) [data]
    FROM
      (
        SELECT DISTINCT LEFT([name],1) [key]
        FROM Patients
      ) k
    ORDER BY k.[key]
    FOR JSON PATH
  ) patient
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

/*
{
  "patient":[
          {"key":"A","data":[{"id":11,"name":"A Patient 11"},{"id":12,"name":"A Patient 12"}]},
          {"key":"B","data":[{"id":21,"name":"B Patient 21"}]},
          {"key":"C","data":[{"id":31,"name":"C Patient 31"},{"id":32,"name":"C Patient 32"}]}
      ]
}
*/

Нашел другой вариант покороче. Вы можете использовать опцию ROOT('patient') здесь

SELECT
  k.[key] [key],
  (SELECT p.id,p.[name] FROM Patients p WHERE LEFT(p.[name],1)=k.[key] FOR JSON PATH) [data]
FROM
  (
    SELECT DISTINCT LEFT([name],1) [key]
    FROM Patients
  ) k
ORDER BY k.[key]
FOR JSON PATH, ROOT('patient')

/*
{
  "patient":[
          {"key":"A","data":[{"id":11,"name":"A Patient 11"},{"id":12,"name":"A Patient 12"}]},
          {"key":"B","data":[{"id":21,"name":"B Patient 21"}]},
          {"key":"C","data":[{"id":31,"name":"C Patient 31"},{"id":32,"name":"C Patient 32"}]}
      ]
}
*/

Другие вопросы по теме