Как представить данные строки в формате JSON в SQL Server 2014 - PullRequest
2 голосов
/ 05 марта 2020

Я хочу представить данные, которые получаются после объединения с другой таблицей. Он получает несколько записей для одного конкретного идентификатора. Поэтому я хочу отобразить эти несколько записей в формате JSON.

У меня есть данные ниже.

Declare @Employees Table (EmpId int, EmpName Varchar(100))
INSERT INTO @Employees
VALUES(1,'RAM')
,(2,'RAJ')
,(3,'LAXMAN')

    Declare @Subjects Table (EmpId int, Subject Varchar(100))
    INSERT INTO @Subjects
    VALUES(1,'Maths')
    ,(1,'Science')
    ,(1,'Physics')
    ,(2,'Physics')
    ,(3,'Maths')
    ,(3,'Physics')

Я пытался с этим запросом.

SELECT E.EmpId
    ,Subject
FROM @Employees E
LEFT JOIN (
    SELECT EmpId
        ,'{' + STUFF((
                SELECT ',"' + NULLIF(Subject, '') + '"'
                FROM @Subjects AS CG1
                WHERE CG1.EmpId = CG2.EmpId
                FOR XML PATH('')
                ), 1, 1, '') + '}' AS Subject
    FROM @Subjects AS CG2
    GROUP BY EmpId
    ) SUB ON SUB.EmpId = E.EmpId

Но я хочу получить такой результат.

    EmpId   Subject
-----------------------------------------------------
    1       {"1":"Maths","2":"Science","3":"Physics"}
    2       {"1":"Physics"}
    3       {"1":"Maths","2":"Physics"}

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Буду признателен за вашу помощь.

Спасибо

1 Ответ

1 голос
/ 05 марта 2020

Вы были очень близки, вам также нужно добавить ROW_NUMBER в подзапрос. Я также переключился на CONCAT для простых неявных преобразований:

SELECT E.EmpId,
       Subject
FROM @Employees E
     LEFT JOIN (SELECT EmpId,
                       '{' + STUFF((SELECT CONCAT(',"', ROW_NUMBER() OVER (ORDER BY CG1.Subject), '":"', NULLIF(Subject, ''), '"')
                                    FROM @Subjects CG1
                                    WHERE CG1.EmpId = CG2.EmpId
                                    ORDER BY Subject
                                    FOR XML PATH('')),1,1,'') + '}' AS Subject
                FROM @Subjects CG2
                GROUP BY EmpId) SUB ON SUB.EmpId = E.EmpId;

Обратите внимание, что порядок объектов в вашей таблице не сохраняется, поскольку нет способа сохранить его с помощью ORDER BY (по крайней мере, не с данными, которые у нас есть). Следовательно, 'Physics' имеет номер 2 вместо 3 для Empid 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...