T-SQL ORDER BY几个子句

时间:2017-07-07 15:08:26

标签: sql sql-server tsql

我目前正在使用SQL Server 2014上的TSQL中的存储过程。我需要编写一个查询来按不同的StatusId排序项目列表。

项目
专案编号
标签
ProjectDataId

ProjectData
ProjectDataId
StatusId

项目通过 ProjectDataId 链接到 ProjectData

演示数据表项目

 ProjectId  | Label |  ProjectDataId | 
------------+-------+----------------+
1           | Pro22 |      2         |
2           | Pro54 |      3         |
3           | Pro87 |      4         |
4           | Pro77 |      5         |
5           | Pro28 |      6         |

演示数据表 ProjectData

 ProjectDataId  |  StatusId   | 
----------------+-------------+
2               |      1      |
3               |      2      |
4               |      3      |
5               |      4      |
6               |      4      |

我目前的结果如下:

 ProjectId  | Label |  StatusId   | 
------------+-------+-------------+
1           | Pro22 |      1      |
2           | Pro54 |      2      |
3           | Pro87 |      3      |
4           | Pro77 |      4      |
5           | Pro28 |      4      |

我当前的查询如下所示:

SELECT ROW_NUMBER() OVER(ORDER BY StatusId ASC)  AS [RowNumber], * 
FROM (SELECT DISTINCT 
        [P].ProjectId
      , [P].Label
      , [PD].StatusId
      , [P].ProjectDataId
     FROM [MySchema].[Project] [P]
     INNER JOIN [MyProject].[ProjectData] [PD] 
     ON [PD].ProjectDataId = [P].ProjectDataId) dt

此查询的工作原理是按statusId asc 1,2,3,4排序,但不能使其按照statusId 1,2, 4 ,3的正确顺序排列。

实际上,期望的输出应为:

 ProjectId  | Label |  StatusId   | 
------------+-------+-------------+
1           | Pro22 |      1      |
2           | Pro54 |      2      |
4           | Pro77 |      4      |
5           | Pro28 |      4      |
3           | Pro87 |      3      |

因此,我需要改变我的排序查询来实现这一点。

我的问题,你知道如何解决这个问题吗?按状态或多或少动态订购?

谢谢!

4 个答案:

答案 0 :(得分:3)

您需要映射您希望它们排序的顺序。

todo

答案 1 :(得分:1)

不是真正理解这个问题,而是根据你的状态来试试这个问题。在字段中选择'语句;

[NewOrder]=case [PD].StatusId when 3 then 99 else [PD].StatusId end

现在按该字段排序

答案 2 :(得分:1)

这实际上非常简单。您需要做的就是在订单中添加CASE语句,并将4替换为3 - 并将4替换为3 - 并将StatusID用于所有其他情况。很容易。

CODE:

DECLARE @Project TABLE (ProjectID int, Label varchar(50), ProjectDataID int)
DECLARE @ProjectData TABLE (ProjectDataID int, StatusID int)

INSERT INTO @Project
VALUES
(1, 'Pro22', 2), 
(2, 'Pro54', 3), 
(3, 'Pro87', 4), 
(4, 'Pro77', 5),
(5, 'Pro28', 6)

INSERT INTO @ProjectData
VALUES
(2, 1),
(3, 2),
(4, 3),
(5, 4),
(6, 4)

SELECT  P.ProjectID, 
        P.Label, 
        PD.StatusID
FROM @Project P
JOIN @ProjectData PD
    ON P.ProjectDataID = PD.ProjectDataID
ORDER BY 
    CASE WHEN PD.StatusID = 4 THEN 3
         WHEN PD.StatusID = 3 THEN 4
         ELSE PD.StatusID
    END

输出:

ProjectID   Label                                              StatusID
----------- -------------------------------------------------- -----------
1           Pro22                                              1
2           Pro54                                              2
4           Pro77                                              4
5           Pro28                                              4
3           Pro87                                              3

(5 row(s) affected)

答案 3 :(得分:1)

来自评论:

  

问:4是唯一无故障的状态吗?或者是否需要更改以后的状态?

     

答:目前,4是唯一的 - 但我认为将来可能会出现其他一些:)

所以项目有一个排序顺序。因此,自然要将sortkey列添加到项目表中。然后它只是:

SELECT
  ROW_NUMBER() OVER (ORDER BY p.sortkey) as rn, -- if you want to show a row number
  p.ProjectId,
  p.Label,
  pd.StatusId,
  p.ProjectDataId
FROM MySchema.Project p
JOIN MySchema.ProjectData pd ON pd.ProjectDataId = p.ProjectDataId
ORDER BY p.sortkey;

我已经删除了DISTINCT关键字,因为当它包含ProjectDataId时,结果中不能有重复项,我猜测。