ORDRE PAR CAS DISTINCT POUR XML

SQL Fiddle

Configuration du schéma SQL Server 2012:

CREATE TABLE Course ( CourseID INT IDENTITY(1,1) ,CourseName NVARCHAR(20) ) CREATE TABLE Session ( SessionID INT IDENTITY(1,1) ,CourseID INT NULL ) CREATE TABLE SessionTime ( ,SessionID INT ,DayOfWeek TINYINT --Sunday(0), Monday(1), ..., Saturday(6) ) INSERT INTO COURSE(CourseName) VALUES('Science 10'), ('Bio 30') INSERT INTO Session(CourseID) VALUES(1), (2) INSERT INTO SessionTime(SessionID, DayOfWeek) VALUES(1, 5), (1, 0), (1, 0), (1, 0), (1, 2), (1, 2), (1, 4), (2, 1), (2, 3) 

Question:

 SELECT C.CourseName ,S.SessionID ,STUFF( (SELECT DISTINCT ', ' + CASE WHEN ST.DayOfWeek = 0 THEN 'Su' WHEN ST.DayOfWeek = 1 THEN 'M' WHEN ST.DayOfWeek = 2 THEN 'T' WHEN ST.DayOfWeek = 3 THEN 'W' WHEN ST.DayOfWeek = 4 THEN 'Th' WHEN ST.DayOfWeek = 5 THEN 'F' WHEN ST.DayOfWeek = 6 THEN 'Sa' END FROM SessionTime ST WHERE ST.SessionID = S.SessionID --ORDER BY DayOfWeek FOR XML PATH ('')) ,1,2,'') AS DaysOfWeek FROM Session S INNER JOIN Course C on S.CourseID = C.CourseID 

Résultats :

 | COURSENAME | SESSIONID | DAYSOFWEEK | |------------|-----------|--------------| | Science 10 | 1 | F, Su, T, Th | | Bio 30 | 2 | M, W | 

Les résultats souhaités:

 | COURSENAME | SESSIONID | DAYSOFWEEK | |------------|-----------|--------------| | Science 10 | 1 | Su, T, Th, F | *Order of DaysOfWeek has changed. | Bio 30 | 2 | M, W | 

Je veux order le DayOfWeek (Su, M, T, W, Th, F, Sa) avant de les STUFF tous set mais mes tentatives ont abouti à l'erreur suivante:

Les éléments ORDER BY doivent apparaître dans la list de sélection si SELECT DISTINCT est spécifié.

J'ai essayé ce qui suit:

  • ORDER BY 1 command les jours par ordre alphabétique (Su, M, T, W, Th, F, Sa)
  • ORDER BY DayOfWeek entraîne le message d'erreur susmentionné
  • ORDER BY DayOfWeekCase ajoutant un AS DayOfWeekCase à la fin du CASE mais cela change la façon dont le FOR XML returnne les jours

Comment puis-je order le DayOfWeek avant de le STUFF set?

Je vous remercie!

Au lieu d'utiliser DISTINCT , essayez d'utiliser GROUP BY . Ensuite, vous pourriez faire ORDER BY DayOfWeek .

 SELECT C.CourseName ,S.SessionID ,STUFF( (SELECT ', ' + CASE WHEN ST.DayOfWeek = 0 THEN 'Su' WHEN ST.DayOfWeek = 1 THEN 'M' WHEN ST.DayOfWeek = 2 THEN 'T' WHEN ST.DayOfWeek = 3 THEN 'W' WHEN ST.DayOfWeek = 4 THEN 'Th' WHEN ST.DayOfWeek = 5 THEN 'F' WHEN ST.DayOfWeek = 6 THEN 'Sa' END FROM SessionTime ST WHERE ST.SessionID = S.SessionID GROUP BY st.DayOfWeek ORDER BY DayOfWeek FOR XML PATH ('')) ,1,2,'') AS DaysOfWeek FROM Session S INNER JOIN Course C on S.CourseID = C.CourseID