我目前正在使用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 |
因此,我需要改变我的排序查询来实现这一点。
我的问题,你知道如何解决这个问题吗?按状态或多或少动态订购?
谢谢!
答案 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
时,结果中不能有重复项,我猜测。