Как представить данные строк в списке, разделенном запятыми, когда в SQL Server 2014 участвуют несколько объединений таблиц - PullRequest
0 голосов
/ 06 марта 2020

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

Мои данные выглядят следующим образом.

Declare @EmpClass Table(ClassId varchar(10),EmpId int)
INSERT INTO @EmpClass
Values('A',1)
,('B',2)
,('C',3)

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

Declare @EmpSubjects Table (EmpId int, SubjectId int)
INSERT INTO @EmpSubjects 
VALUES(1,1)
,(1,2)
,(1,3)
,(2,1)
,(3,1)
,(3,2)

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

Я пробовал ниже код и получил следующий результат

SELECT EC.ClassId,E.EmpId
    ,ES.SubjectId,Subject
FROM @EmpClass EC
LEFT JOIN @Employees E ON EC.EmpId=E.EmpId
LEFT JOIN @EmpSubjects ES ON E.EmpId=ES.EmpId
LEFT JOIN @Subjects S ON S.SubjectId=ES.SubjectId
WHERE E.EmpId=1

Я получил следующий результат

ClassId EmpId   SubjectId   Subject
A         1       1         Maths
A         1       2         Science
A         1       3         Physics

Результат, необходимый следующим образом.

ClassId   EmpId SubjectId    Subject
A           1       1         {"1":"Maths","2":"Science","3":"Physics"}

Я ценю вашу помощь в этом .

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

С 2014 года это немного больше проблем, но вот вариант с использованием функций xml:

SELECT  [Results].[ClassId]
       , [Results].[EmpId]
       , '{' + STUFF((SELECT ',"' + CONVERT(VARCHAR(2), tb.[SubjectId]) + '":"' + CAST(tb.[Subject] AS VARCHAR(MAX)) + '"'
                   FROM   (
                              SELECT    [EC].[ClassId]
                                      , [E].[EmpId]
                                      , [ES].[SubjectId]
                                      , [S].[Subject]
                              FROM      @EmpClass [EC]
                              LEFT JOIN @Employees [E]
                                  ON [EC].[EmpId] = [E].[EmpId]
                              LEFT JOIN @EmpSubjects [ES]
                                  ON [E].[EmpId] = [ES].[EmpId]
                              LEFT JOIN @Subjects [S]
                                  ON [S].[SubjectId] = [ES].[SubjectId]
                          ) AS [tb]
                   WHERE  ( [tb].[ClassId] = [Results].[ClassId] AND tb.[EmpId] = [Results].[EmpId] )
                   FOR XML PATH(''), TYPE
               ).[value]('(./text())[1]', 'VARCHAR(MAX)'), 1, 1, '') + '}' AS [Subjects]
FROM     (
             SELECT    [EC].[ClassId]
                     , [E].[EmpId]
                     , [ES].[SubjectId]
             FROM      @EmpClass [EC]
             LEFT JOIN @Employees [E]
                 ON [EC].[EmpId] = [E].[EmpId]
             LEFT JOIN @EmpSubjects [ES]
                 ON [E].[EmpId] = [ES].[EmpId]
         ) [Results]
WHERE     [Results].[EmpId] = 1
GROUP BY [Results].[ClassId], [Results].[EmpId]

Предоставление вам результатов:

ClassId    EmpId       Subjects
---------- ----------- -------------------------------------------
A          1           {"1":"Maths", "2":"Science", "3":"Physics"}

Первый подзапрос конвертируется в XML с использованием FOR XML, поэтому мы можем в основном агрегировать столбцы. Затем STUFF () , чтобы удалить ведущий "," из него. Затем оберните это "{}"

0 голосов
/ 06 марта 2020

Данные через запятую в вашем ожидаемом результате выглядят как JSON для меня. Вы пробовали что-то подобное?

SELECT EC.ClassId,E.EmpId,
    Subject = (
        SELECT [1], [2], [3], [4], [5], [6]
        FROM (
            SELECT S.SubjectID, S.Subject
            FROM @EmpSubjects ES
            LEFT JOIN @Subjects S ON S.SubjectId=ES.SubjectId
            WHERE ES.EmpId=E.EmpId
        ) as Src
        PIVOT (
            MAX([Subject])
            for [SubjectID] in ([1], [2], [3], [4], [5], [6])
        ) as p
        FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
    )
FROM @EmpClass EC
LEFT JOIN @Employees E ON EC.EmpId=E.EmpId
WHERE E.EmpId=1

Что дает результат:

ClassId  EmpId  Subject
-------- ------ -----------------------------------------
A        1      {"1":"Maths","2":"Science","3":"Physics"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...