sql - 按 XML 的不同大小写排序

标签 sql sql-server sql-order-by distinct

SQL Fiddle

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)

查询:

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

Results :

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

期望的结果:

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

我想在将 DayOfWeek (Su,M,T,W,Th,F,Sa) STUFF 全部放在一起之前订购它们,但我的尝试导致了以下错误:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

我试过以下方法:

  • ORDER BY 1 按字母顺序排列日期,而不是 (Su,M,T,W,Th,F,Sa)
  • ORDER BY DayOfWeek 导致上述错误消息
  • ORDER BY DayOfWeekCase 添加一个 AS DayOfWeekCaseCASEEND 但这改变了方式 FOR XML 返回天数

如何在 STUFF 合并之前订购 DayOfWeek

谢谢!

最佳答案

不要使用 DISTINCT,请尝试使用 GROUP BY。然后,您可以执行 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

关于sql - 按 XML 的不同大小写排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28848566/

相关文章:

MySQL 排序行

php - MySQL & PHP - 选择 6 行,每行有不同的 'WHERE' 子句

sql - 按字母数字排序

c# - 如何依次处理两个函数调用之间的数据

sql - 如果嵌套查询返回 null,则将列设置为某个值

sql-server - 根据不同的事件选择最早的日期并加入其他表

sql - 获取单个查询中记录的计数百分比

mysql - SQL - 更新表和排序依据?

sql - 希望在一份声明中更新现有记录

MySQL - 无法在 mysql 5.7 上使用 REFERENCES(但在 5.0 上工作)