Tsql 根据分组在一起的多个列对表中的行进行排序

Tsql 根据分组在一起的多个列对表中的行进行排序,tsql,sql-server-2008-r2,sql-order-by,Tsql,Sql Server 2008 R2,Sql Order By,我在一个特定结构的表中有数据。以下是它的屏幕截图: 我希望所有这些行都根据其各自批次中状态ID的顺序进行排序。这是我想要的输出: 我们可以说,我希望根据行的单个批中从最小到最大的状态ID对行进行排序。这意味着最大状态ID为95的所有分支将彼此相邻排列,然后是状态ID为100的分支,最后是状态ID为104的分支 我也为它创建了一个示例sql脚本 DECLARE @tbl AS TABLE( State_ID INT, Branch INT, ID INT ); INSERT INTO

我在一个特定结构的表中有数据。以下是它的屏幕截图:

我希望所有这些行都根据其各自批次中状态ID的顺序进行排序。这是我想要的输出:

我们可以说,我希望根据行的单个批中从最小到最大的状态ID对行进行排序。这意味着最大状态ID为95的所有分支将彼此相邻排列,然后是状态ID为100的分支,最后是状态ID为104的分支

我也为它创建了一个示例sql脚本

DECLARE @tbl AS TABLE(
  State_ID INT,
  Branch INT,
  ID INT
);

INSERT INTO @tbl
SELECT 94,1,1
UNION ALL SELECT 95,1,2
UNION ALL SELECT 94,2,3
UNION ALL SELECT 95,2,4
UNION ALL SELECT 94,3,5
UNION ALL SELECT 103,3,6
UNION ALL SELECT 104,3,7
UNION ALL SELECT 94,4,8
UNION ALL SELECT 95,4,9
UNION ALL SELECT 94,5,10
UNION ALL SELECT 96,5,11
UNION ALL SELECT 100,5,12
UNION ALL SELECT 94,6,13
UNION ALL SELECT 95,6,14

当我尝试根据State\u ID然后分支进行排序时,它将State\u ID为94的所有行排列在一起,这是我不想要的。那么,我怎样才能用最简单、最快的方法实现我想要的结果呢

这可以使用像这样的CTE来完成

;WITH cteX
AS(
    SELECT T.Branch, MIN(T.State_ID) 'Min_StateId', MAX(T.State_ID) 'Max_StateId'
    FROM @tbl T
    GROUP BY T.Branch
)
SELECT B.*
FROM @tbl B
INNER JOIN cteX X ON X.Branch = B.Branch
ORDER BY X.Max_StateId, Branch, State_ID

这可以使用像这样的CTE来完成

;WITH cteX
AS(
    SELECT T.Branch, MIN(T.State_ID) 'Min_StateId', MAX(T.State_ID) 'Max_StateId'
    FROM @tbl T
    GROUP BY T.Branch
)
SELECT B.*
FROM @tbl B
INNER JOIN cteX X ON X.Branch = B.Branch
ORDER BY X.Max_StateId, Branch, State_ID