2017-07-19 54 views
1

我有这样的SQL Server表:如何在SQL Server中以预定义的顺序获取行?

MenuID MenuName   MenuColor 
--------------------------------------- 
10   Daily Tickets  Gray 
15   Kids Ticket  Dark Pink 
20   Group Discount Dark Ash 
11   Discount ticket Brown 
17   Referral Ticket Beige 
22   Frequent visitor Musturd 
27   Annual Pass  sky blue 
25   Kids Pass   Pink 
24   free Ticket  Yellow 

这个表有很多记录和多个列太..

期望的结果 - 前四个菜单应以预先定义的顺序排序(其中我在试用查询提到)和剩余应在MENUNAME列排序ASC

所需的结果集:

MenuID MenuName   MenuColor 
--------------------------------------- 
10   Daily Tickets  Gray 
27   Annual Pass  sky blue 
22   Frequent visitor Musturd 
20   Group Discount Dark Ash 
11   Discount ticket Brown 
24   free Ticket  Yellow 
25   Kids Pass   Pink 
15   Kids Ticket  Dark Pink 
17   Referral Ticket Beige 

这是我为此尝试的查询:

SELECT * 
FROM tMenus m 
ORDER BY 
    (CASE m.MenuName 
     WHEN 'Daily Tickets' THEN 1 
     WHEN 'Annual Pass' THEN 2 
     WHEN 'Frequent visitor' THEN 3 
     WHEN 'Group Discount' THEN 4 
     END), m.MenuName ASC; 

但是,这并没有返回我想要的结果。请纠正我错在哪里。

感谢

+2

为什么不简单地添加一个“Dis playOrder“列到表中? –

+0

你的意思是优先吗?哪一个更推荐解决方案?我需要为每一行定义优先权? – Lina

+1

我的首选是添加列并设置每一行的值。 1)它使排序正确的一个非常简单的任务。 2)它有助于在多个查询中提供一致性(无需继续反复查看案例表达式,并且可能将其搞砸)。 3)在查看这些值时,告诉未来发展组织有一个排序偏好。 4)它可以被索引,从而可以消除查询计划中的排序操作。 –

回答

4

也许你只需要一个else

ORDER BY (CASE m.MenuName 
      WHEN 'Daily Tickets' THEN 1 
      WHEN 'Annual Pass' THEN 2 
      WHEN 'Frequent visitor' THEN 3 
      WHEN 'Group Discount' THEN 4 
      ELSE 5 
      END) , m.MenuName ASC; 
+0

什么是5?下一个订单号? – Lina

+1

“else 5”表示MenuName与任何东西都不匹配.... – granadaCoder

+0

找到了你。有效!!!谢谢 – Lina

1

添加 “DisplayOrder”,以实际的表...

IF OBJECT_ID('tempdb..#Menue', 'U') IS NOT NULL 
DROP TABLE #Menue; 

CREATE TABLE #Menue (
    MenuID INT NOT NULL PRIMARY KEY, 
    MenuName VARCHAR(30) NOT NULL, 
    MenuColor VARCHAR(10) NOT NULL, 
    DisplayOrder INT NOT NULL 
    ); 

INSERT #Menue(MenuID, MenuName, MenuColor, DisplayOrder) VALUES 
    (10,'Daily Tickets', 'Gray', 100), 
    (15,'Kids Ticket', 'Dark Pink', 800), 
    (20,'Group Discount', 'Dark Ash', 400), 
    (11,'Discount ticket', 'Brown', 500), 
    (17,'Referral Ticket', 'Beige', 900), 
    (22,'Frequent visitor', 'Musturd', 300), 
    (27,'Annual Pass', 'sky blue', 200), 
    (25,'Kids Pass', 'Pink', 700), 
    (24,'free Ticket', 'Yellow', 600); 
    -- Note: I'm leaving gaps in the DisplayOrder values. 
    -- This makes it easy to add new values and set their 
    -- values w/o having to adjust existing values. 

SELECT 
    m.MenuID, 
    m.MenuName, 
    m.MenuColor 
FROM 
    #Menue m 
ORDER BY 
    m.DisplayOrder; 

编辑答案...

IF OBJECT_ID('tempdb..#MenueDisplayOrder', 'U') IS NOT NULL 
DROP TABLE #MenueDisplayOrder; 

CREATE TABLE #MenueDisplayOrder (
    MenueID INT NOT NULL, --add FK to Menues table 
    DisplayTypeID INT NOT NULL, --add FK to available Types table 
    DisplayOrder INT NOT NULL 
    PRIMARY KEY CLUSTERED (DisplayTypeID, MenueID) 
    ); 

    INSERT #MenueDisplayOrder (MenueID, DisplayTypeID, DisplayOrder) VALUES 
    (10, 1, 100), (11, 1, 500), (15, 1, 800), (17, 1, 900), (20, 1, 400), 
    (22, 1, 300), (24, 1, 600), (25, 1, 700), (27, 1, 200), 
    (27, 2, 100), (25, 2, 500), (24, 2, 800), (20, 2, 900), (17, 2, 400), 
    (22, 2, 300), (15, 2, 600), (11, 2, 700), (10, 2, 200), 
    (15, 3, 100), (11, 3, 500), (10, 3, 800), (22, 3, 900), (24, 3, 400), 
    (17, 3, 300), (20, 3, 600), (27, 3, 700), (25, 3, 200); 

SELECT 
    m.MenuID, 
    m.MenuName, 
    m.MenuColor 
FROM 
    #Menue m 
    JOIN #MenueDisplayOrder mdo 
     ON m.MenuID = mdo.MenueID 
WHERE 
    mdo.DisplayTypeID = 2 -- alter this value to change the display order. 
ORDER BY 
    mdo.DisplayOrder; 
+0

感谢您为此付出努力。我有一个疑问,如果我的非预定义组的订单总是不断变化,说Asc,说明或命令在其他一些列,如'MenuColor'? – Lina

+1

大家最喜欢的答案,“它取决于”......如果是我,我必须根据不同的用例维护几种不同的类型,我很可能会创建一个带有“DisplayType”列的单独DisplayOrder表。我会用另一个例子更新我的答案... –

+0

Got you ...谢谢。 – Lina

相关问题