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