我有一个具有已定义分组的结果集(用于报告)。有可能未分配位置,因此没有“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
思想?
答案 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;