Stuff Query с несколькими объединениями - PullRequest
0 голосов
/ 05 июля 2018
SELECT 
    S.enroll_no, 
    Pm.periodname 
FROM
    studentattendencedetails AS SA 
LEFT JOIN 
    studentattendencemaster AS SM ON SA.attendencemasterid = SM.id 
LEFT JOIN 
    tbl_periodmaster AS Pm ON SA.periodid = Pm.id 
LEFT JOIN 
    students AS S ON SA.studentid = S.id 
WHERE  
    SA.isabsent = 2 
    AND s.enroll_no IN ('YYYYYYYYY','XXXXXXXXXX')
ORDER BY 
    S.enroll_no

Выход:

Enroll_No   PeriodName 
-----------------------
YYYYYYYYY   1
YYYYYYYYY   2
XXXXXXXXXX  6
XXXXXXXXXX  1
XXXXXXXXXX  7

Я хотел бы отобразить имя периода со значениями, разделенными запятыми, следующим образом

Enroll_No   PeriodName
------------------------
YYYYYYYYY   1,2
XXXXXXXXXX  1,6,7

И я попробовал следующий запрос вещи

SELECT 
    t.enroll_no, 
    periodList  = STUFF((SELECT ', ' + Pm.periodname 
                         FROM studentattendencedetails AS SA 
                         LEFT JOIN studentattendencemaster AS SM ON SA.attendencemasterid = SM.id 
                         LEFT JOIN tbl_periodmaster AS Pm ON SA.periodid = Pm.id 
                         LEFT JOIN students AS S ON SA.studentid = S.id 
                         WHERE s.enroll_no IN ('YYYYYYYYY','XXXXXXXXXX') 
                           AND SA.isabsent = 2
                         FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')
FROM 
    dbo.students AS t 
WHERE   
    t.enroll_no IN ('YYYYYYYYY','XXXXXXXXXX')
ORDER BY 
    t.enroll_no;

Выход:

Enroll_No   PeriodName
---------------------------
YYYYYYYYY   6, 1, 2, 1, 7
XXXXXXXXXX  6, 1, 2, 1, 7

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вам нужно сделать так:

Так что, в основном, вам не хватает a, где t.Enroll_no = s.Enroll_no, а затем сгруппировать по вашему запросу

declare @table table (enroll nvarchar(50),periodname int)

insert into @table

values


('YYYYYYYYY' , 1),
('YYYYYYYYY' , 2),
('XXXXXXXXXX', 6),
('XXXXXXXXXX',1 ),
('XXXXXXXXXX',7 )

select enroll, PeriodList = stuff((select N', '+cast(PeriodName as nvarchar(2)) from @table t2 where t.enroll = t2.enroll order by periodname 
FOR XML PATH (N''),TYPE).value(N' .[1]', N'nvarchar(max)'),1,2,N'') from @table t
group by enroll

Обновление на основе комментариев владельцев тем

Вы можете создать представление:

Create view dbo.EnrollmentPeriodList as 

SELECT 
    S.enroll_no, 
    Pm.periodname 
FROM
    studentattendencedetails AS SA 
LEFT JOIN 
    studentattendencemaster AS SM ON SA.attendencemasterid = SM.id 
LEFT JOIN 
    tbl_periodmaster AS Pm ON SA.periodid = Pm.id 
LEFT JOIN 
    students AS S ON SA.studentid = S.id 
WHERE  
    SA.isabsent = 2 
    AND s.enroll_no IN ('YYYYYYYYY','XXXXXXXXXX') 

А потом код

select enroll, PeriodList = stuff((select N', '+cast(PeriodName as nvarchar(2)) from dbo.EnrollmentPeriodList t2 where t.enroll = t2.enroll order by periodname 
FOR XML PATH (N''),TYPE).value(N' .[1]', N'nvarchar(max)'),1,2,N'') from dbo.EnrollmentPeriodList t
group by enroll
0 голосов
/ 05 июля 2018

Вы совсем близко. Вам просто нужно условие корреляции в вашем подзапросе:

SELECT s.enroll_no, 
       STUFF((SELECT ', ' + Pm.periodname 
              FROM studentattendencedetails SA JOIN
                   studentattendencemaster SM
                   ON SA.attendencemasterid = SM.id JOIN
                   tbl_periodmaster Pm
                   ON SA.periodid = Pm.id 
              WHERE SA.studentid = S.id AND
                    s.enroll_no IN ('YYYYYYYYY', 'XXXXXXXXXX') AND
                    SA.isabsent = 2
              FOR XML PATH(''), TYPE
             ).value('.[1]', 'nvarchar(max)'), 1, 2, ''
            ) as periodlist
FROM  dbo.students s
WHERE s.enroll_no IN ('YYYYYYYYY','XXXXXXXXXX')
ORDER BY s.enroll_no;
0 голосов
/ 05 июля 2018

Если вы работаете с MSSQL 2017, это должно помочь:

    SELECT S.enroll_no, STRING_AGG(Pm.periodname, ',') WITHIN GROUP (ORDER BY Pm.periodname)         
    FROM studentattendencedetails AS SA 
    LEFT JOIN studentattendencemaster AS SM ON SA.attendencemasterid = SM.id 
    LEFT JOIN tbl_periodmaster AS Pm ON SA.periodid = Pm.id 
    LEFT JOIN students AS S ON SA.studentid = S.id 
    WHERE SA.isabsent = 2 and s.enroll_no in ('YYYYYYYYY','XXXXXXXXXX') 
    GROUP BY S.enroll_no
    ORDER BY S.enroll_no
...