Несколько рядов в один ряд. Получать все дни вместо тех, которые соответствуют курсу. Ниже приведены результаты - PullRequest
0 голосов
/ 09 мая 2018
select distinct
       dbo.Courses.DisplayName AS CourseInternalName,
       dbo.courses.CourseID, 
       stuff((select distinct ','+ (case when CourseSchedules.dayid = 1 then 'Mon'
                                         when CourseSchedules.dayid = 2 then 'Tue'
                                         when CourseSchedules.dayid = 3 then 'Wed' 
                                         when CourseSchedules.dayid = 4 then 'Thur'
                                         when CourseSchedules.dayid = 5 then 'Fri'
                                         when CourseSchedules.dayid = 6 then 'Sat'
                                         when CourseSchedules.dayid = 7 then 'Sun'
                                     end) 
               FROM  dbo.Courses 
               left outer join dbo.CourseSchedules 
                    on dbo.Courses.CourseGUID = dbo.CourseSchedules.CourseGUID
               for xml path('')),1,1,'') AS Days

from  dbo.Courses 
left outer join dbo.CourseSchedules 
     on dbo.Courses.CourseGUID = dbo.CourseSchedules.CourseGUID
Where courses.CourseID = 5815

Результат:

CourseInternalName  CourseID    Days
Red Cross Sunfish - CC  5815    Mon,Fri,Wed,Tue,Thur,Sat

это все дни недели, а не только те, по которым проходит курс.

Также необходимо заказать дни.

Если я удаляю предложение from в операторе Stuff, я получаю правильные дни, но в несколько рядов.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Проблема заключается в том, что из вашего подзапроса вы не говорите ему выбрать только один курс, который вы говорите, чтобы выбрать любой курс, который соответствует курсу в Курсах. Коррекция ниже. И на самом деле, поскольку ваш подзапрос совершенно отдельный, нет необходимости в первом соединении

select distinct
       dbo.Courses.DisplayName AS CourseInternalName,
       dbo.courses.CourseID, 
       stuff((select distinct ','+ (case when CourseSchedules.dayid = 1 then 'Mon'
                                         when CourseSchedules.dayid = 2 then 'Tue'
                                         when CourseSchedules.dayid = 3 then 'Wed' 
                                         when CourseSchedules.dayid = 4 then 'Thur'
                                         when CourseSchedules.dayid = 5 then 'Fri'
                                         when CourseSchedules.dayid = 6 then 'Sat'
                                         when CourseSchedules.dayid = 7 then 'Sun'
                                     end) 
               FROM  dbo.CourseSchedules
               Where CourseSchedules.CourseID = 5815
               ORDER BY CourseSchedules.dayid ASC
               for xml path('')),1,1,'') AS Days

from  dbo.Courses 
Where courses.CourseID = 5815
0 голосов
/ 09 мая 2018

Ваши левые объединения избыточны, в результате чего ваш запрос возвращает неожиданные результаты.

Попробуйте вместо этого:

Сначала создайте и заполните таблицы примеров ( Пожалуйста, спасите насэтот шаг в ваших будущих вопросах):

CREATE TABLE Courses
(
    CourseID int,
    DisplayName varchar(10),
    CourseGUID uniqueidentifier DEFAULT(NEWID())
)

CREATE TABLE CourseSchedules
(
    dayid int,
    CourseGUID uniqueidentifier
)

INSERT INTO Courses(CourseID, DisplayName)
VALUES (5815, 'Test')

INSERT INTO CourseSchedules
SELECT 1, CourseGUID FROM Courses UNION
SELECT 3, CourseGUID FROM Courses UNION
SELECT 5, CourseGUID FROM Courses 

Запрос:

SELECT DISTINCT
       dbo.Courses.DisplayName AS CourseInternalName,
       dbo.courses.CourseID, 
       STUFF((SELECT ','+ CASE WHEN dayid = 1 THEN 'Mon'
                               WHEN dayid = 2 THEN 'Tue'
                               WHEN dayid = 3 THEN 'Wed' 
                               WHEN dayid = 4 THEN 'Thur'
                               WHEN dayid = 5 THEN 'Fri'
                               WHEN dayid = 6 THEN 'Sat'
                               WHEN dayid = 7 THEN 'Sun'
                          END
               FROM  dbo.CourseSchedules 
               WHERE dbo.CourseSchedules.CourseGUID = dbo.Courses.CourseGUID
               ORDER BY dayid
               FOR XML PATH('')),1,1,'') AS Days
FROM  dbo.Courses 
WHERE courses.CourseID = 5815

Результаты:

CourseInternalName  CourseID    Days
Test                5815        Mon,Wed,Fri
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...