Sql 选择未按顺序正确排序的案例值
我有一个已定义分组的结果集(用于报表)。该职位可能未分配,因此没有“网格组”。在本例中,我将赋值为99。这是正确的工作,除了秩序的人,99始终是第一个,它应该是最后一个(如果我不描述它在底部)。我试过在选择端和在Grid_组的order by中进行演员阵容,但两者都有相同的结果,顶部为99。(Sql server 2008) 下面是代码片段,我删除了所有其他不需要的列Sql 选择未按顺序正确排序的案例值,sql,select,Sql,Select,我有一个已定义分组的结果集(用于报表)。该职位可能未分配,因此没有“网格组”。在本例中,我将赋值为99。这是正确的工作,除了秩序的人,99始终是第一个,它应该是最后一个(如果我不描述它在底部)。我试过在选择端和在Grid_组的order by中进行演员阵容,但两者都有相同的结果,顶部为99。(Sql server 2008) 下面是代码片段,我删除了所有其他不需要的列 SELECT s.SessionNumber,Position.PositionName,(Select CASE when d
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
想法?您还需要在order by上应用
案例
(请记住,这会破坏排序操作的索引利用率)。您的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应用一些较小的格式。在这种情况下,
ORDER BY
将看不到您的计算列。要获得您想要的效果,您必须按
相同的表达式排序(kastermester的答案正在演示),或者将查询包装在一个公共表表达式中,并按
排序,同时从中进行选择,例如
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;
但是没有CTE应用99,您的
案例也不在顺序中。所以它可能是按空值排序的。顺便说一句,您可以使用或而不是编写自己的案例来指定默认值-if-null。谢谢,效果很好。《秩序》中的联合和案例都提供了预期的结果。很高兴听到它起作用了。是的,COALESCE
将是一种更简洁的表达逻辑的方式-我建议使用它而不是CASE
表达式。