选择Case值不按顺序正确排序

时间:2013-12-21 14:51:54

标签: sql select

我有一个具有已定义分组的结果集(用于报告)。有可能未分配位置,因此没有“Grid_Group”。在这种情况下,我指定一个值99.这是正常工作,除了顺序,99始终是第一个,它应该是最后一个(如果我做desc它是在底部)。我已经尝试了选择方面以及Grid_Group中的顺序内的强制转换,但两者都有相同的结果,顶部有99。 (Sql server 2008)

这是片段,我删除了所有其他不需要的列。

SELECT s.SessionNumber,Position.PositionName,(Select CASE when dbo.Position.Grid_Group is null THEN 99 ELSE dbo.Position.Grid_Group END) as Grid_Group 
             FROM dbo.USession AS us Left Outer JOIN  
                     dbo.Position ON us.PositionId = dbo.Position.PositionId FULL OUTER JOIN  
                     dbo.Sessions AS s ON us.SessionId = s.SessionId  
                     ORDER BY S.SessionNumber, dbo.Position.Grid_Group

思想?

2 个答案:

答案 0 :(得分:1)

您还需要在订单上应用CASE(请记住这会破坏排序操作的索引利用率)。您的ORDER BY引用了原始表的列,而不是您的别名结果列。这样的事情可以解决问题:

SELECT
    s.SessionNumber,Position.PositionName,
    (CASE
        WHEN dbo.Position.Grid_Group IS NULL THEN 99
        ELSE dbo.Position.Grid_Group
    END) AS Grid_Group 
FROM dbo.USession AS us
LEFT OUTER JOIN dbo.Position ON us.PositionId = dbo.Position.PositionId
FULL OUTER JOIN dbo.Sessions AS s ON us.SessionId = s.SessionId  
ORDER BY
    S.SessionNumber,
    (CASE
        WHEN dbo.Position.Grid_Group IS NULL THEN 99
        ELSE dbo.Position.Grid_Group
    END)

我允许自己应用SQL的一些次要格式。

答案 1 :(得分:1)

在这种情况下,ORDER BY将无法看到您的计算列。为了获得你所要求的效果,你必须ORDER BY使用相同的表达式(kastermester的答案正在演示),或者将查询包装在公用表表达式中ORDER BY,同时从中选择,像;

WITH cte AS (
  SELECT s.SessionNumber, p.PositionName, COALESCE(p.Grid_Group, 99) Grid_Group 
  FROM dbo.USession AS us 
  LEFT OUTER JOIN dbo.Position p ON us.PositionId = p.PositionId 
  FULL OUTER JOIN dbo.Sessions s ON us.SessionId  = s.SessionId
)
SELECT * FROM cte ORDER BY SessionNumber, Grid_Group;