Problème avec Order By avec XML pour FOR dans T-sql (La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, les tables dérivées)

select a.Hall, a.Title, STUFF((SELECT ', ' + '[' + CONVERT(varchar(2),DATEPART(Hour, b.StartFilm)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.StartFilm)) + ' ' + CONVERT(varchar(2),DATEPART(Hour, b.EndTime)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.EndTime)) + ']' FROM (select c.Name as Hall, b.Title, Convert(time,a.StartFilmTime) as StartFilm, Convert(time,a.EndFilmTime) as EndTime from FilmSchedule a left join Film b on a.FilmId = b.Id left join Room c on a.RoomId = c.Id where a.ApproveStatus = 1 and a.Status = 1 and CONVERT(date, a.StartFilmTime) = '05-06-2015' ) b Where a.Hall = b.Hall and a.Title = b.Title FOR XML PATH('')),1,1,'') As ShowTime from (select c.Name as Hall, b.Title, Convert(time,a.StartFilmTime) as StartFilm, Convert(time,a.EndFilmTime) as EndTime from FilmSchedule a left join Film b on a.FilmId = b.Id left join Room c on a.RoomId = c.Id where a.ApproveStatus = 1 and a.Status = 1 and CONVERT(date, a.StartFilmTime) = '05-06-2015' Order by a.StartFilmTime ) a group by a.Hall, a.Title 

J'ai l'erreur:

La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, les tables dérivées, les sous-requêtes et les expressions de table communes, sauf si TOP ou FOR XML est également spécifié.

Aidez-moi, s'il vous plaît! (J'ai utilisé FOR XML ?)

Bien que votre requête utilise FOR XML (pour la solution de contournement GROUP_CONCAT ), vous appliquez l'ordre en dehors de la table dérivée qui utilise FOR XML , d'où l'erreur.

Étant donné que vous n'incluez pas directement la date de début dans la sélection finale (bien que vous la ORDER BY StartFilm dans la colonne STUFF ShowTime ), vous ne pouvez pas non plus ORDER BY StartFilm dans le GROUP BY final, car la colonne aurait autrement besoin à inclure dans GROUP BY ou comme colonne agrégée.

Ce que vous pouvez faire est de déplacer le ORDER BY dans le STUFF et ensuite order par la colonne dérivée ShowTime (puisque votre requête ne s'exécute que pour un jour donné, et StartFilmTime est la première partie de la colonne composée STUFFED ).

Dans le même time, je voudrais sécher la répétition sur la table dérivée avec un CTE:

 WITH cteFiltered AS (select c.Name as Hall, b.Title, Convert(time,a.StartFilmTime) as StartFilm, Convert(time,a.EndFilmTime) as EndTime from FilmSchedule a left join Film b on a.FilmId = b.Id left join Room c on a.RoomId = c.Id where a.ApproveStatus = 1 and a.Status = 1 and CONVERT(date, a.StartFilmTime) = '05-06-2015' ) select a.Hall, a.Title, STUFF((SELECT ', ' + '[' + CONVERT(varchar(2),DATEPART(Hour, b.StartFilm)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.StartFilm)) + ' ' + CONVERT(varchar(2),DATEPART(Hour, b.EndTime)) + ':' + CONVERT(varchar(2),DATEPART(Minute, b.EndTime)) + ']' FROM cteFiltered b Where a.Hall = b.Hall and a.Title = b.Title order by b.StartFilm -- *** FOR XML PATH('')),1,1,'') As ShowTime from cteFiltered a group by a.Hall, a.Title order by ShowTime; -- *** Hour is first (assuming 24H format) and only one day