2011-06-23 64 views
0

我想要检索表中的所有值,按字母顺序排序并将“全部”附加到顶部(全部不在表格中)。SQL排序问题

当前代码:

SELECT 0 AS TypeID, 'All' AS [Type] 
UNION 
SELECT TypeID, [Type] FROM tbl_Type ORDER BY 2 

此订单的一切,包括所有的,这是有问题的,因为我在这台所谓的“协议”,这之后的排序显示了之前所有的值。

有没有什么办法可以返回一个列表顶部的“全部”和其下的所有东西?

UPDATE:

我试图通过Andomar和康拉德建议的解决方案,但是我得到以下错误:

Msg 207, Level 16, State 1, Line 4 
Invalid column name 'Type'. 
Msg 104, Level 16, State 1, Line 4 
ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator. 

回答

3

你可以使用case排序'全部'前面:

SELECT 0 AS TypeID, 'All' AS [Type] 
UNION 
SELECT TypeID, [Type] FROM tbl_Type 
ORDER BY case when Type = 'All' then 1 else 2 end, Type 

编辑:根据您的评论,SQL Server不允许order by别名。使用子查询:

SELECT * 
FROM (
     SELECT 0 AS TypeID, 'All' AS [Type] 
     UNION 
     SELECT TypeID, [Type] FROM tbl_Type 
     ) as SubQueryAlias 
ORDER BY case when Type = 'All' then 1 else 2 end, Type 

或在这种情况下,因为类型是一个实际的表中的字段,而不是一个别名,交换联盟的两个部分:

SELECT TypeID, [Type] FROM tbl_Type 
UNION 
SELECT 0 AS TypeID, 'All' AS [Type] 
ORDER BY case when Type = 'All' then 1 else 2 end, Type 
+0

查看我原来帖子的更新。 – JGow

+0

@JGow:对,SQL Server恼人地不允许没有子查询的别名。回答编辑。 – Andomar

+0

谢谢,你编辑的第一部分工作完美! – JGow

3

随着Andomar的答案,你也可以做到这一点来解决别名问题。

WITH CTE As 
(

    SELECT 0 AS TypeID, 'All' AS [Type] 
    UNION 
    SELECT TypeID, [Type] FROM tbl_Type 
    ORDER BY 
) 
SELECT 
    typeID, 
    Type, 
FROM 
     CTE 
ORDER BY 
    CASE 
     WHEN TypeID = 0 THEN typeID 
     ELSE Type 
    END 

但这种假设tbl_type.type的所有值都大于0

你也可以添加其他字段的CTE

WITH CTE As 
(

    SELECT 0 AS TypeID, 'All' AS [Type], 1 as sortorder 
    UNION 
    SELECT TypeID, [Type] FROM tbl_Type, 2 as sortorder 
    ORDER BY 
) 
SELECT 
    typeID, 
    Type, 
FROM 
     CTE 
ORDER BY 
    sortorder, 
    type 
+0

查看我原来的帖子的更新 – JGow

1
SELECT 0 AS TypeID, 'All' AS [Type] UNION SELECT TypeID, [Type] FROM tbl_Type ORDER BY 2 DESC 
1

你可以只添加第三列进行排序,其指示它是否是一个数据记录(或 “全部”)

SELECT 0 AS TYPEID, '全部' AS [类型],0 AS IsDataRecord UNION SELECT TYPEID,[类型],1 AS IsDataRecord FROM tbl_Type ORDER BY 3, 2