Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择未按顺序正确排序的案例值_Sql_Select - Fatal编程技术网

Sql 选择未按顺序正确排序的案例值

Sql 选择未按顺序正确排序的案例值,sql,select,Sql,Select,我有一个已定义分组的结果集(用于报表)。该职位可能未分配,因此没有“网格组”。在本例中,我将赋值为99。这是正确的工作,除了秩序的人,99始终是第一个,它应该是最后一个(如果我不描述它在底部)。我试过在选择端和在Grid_组的order by中进行演员阵容,但两者都有相同的结果,顶部为99。(Sql server 2008) 下面是代码片段,我删除了所有其他不需要的列 SELECT s.SessionNumber,Position.PositionName,(Select CASE when d

我有一个已定义分组的结果集(用于报表)。该职位可能未分配,因此没有“网格组”。在本例中,我将赋值为99。这是正确的工作,除了秩序的人,99始终是第一个,它应该是最后一个(如果我不描述它在底部)。我试过在选择端和在Grid_组的order by中进行演员阵容,但两者都有相同的结果,顶部为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

想法?

您还需要在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
表达式。