【问题标题】:ORDER BY DISTINCT CASE FOR XML按 XML 不同大小写排序
【发布时间】:2023-03-16 07:35:01
【问题描述】:

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 |

我想在STUFF 之前订购 DayOfWeek (Su,M,T,W,Th,F,Sa),但我的尝试导致以下错误:

如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中。

我尝试了以下方法:

  • ORDER BY 1 不按字母顺序排列日期(Su,M,T,W,Th,F,Sa)
  • ORDER BY DayOfWeek 导致上述错误消息
  • ORDER BY DayOfWeekCaseAS DayOfWeekCase 添加到 CASEEND 中,但这会改变 FOR XML 返回天数的方式

如何在STUFF一起订购之前订购DayOfWeek

谢谢!

【问题讨论】:

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


    【解决方案1】:

    不要使用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
    

    【讨论】:

    • 没问题,很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多