Man*_*oyz 2 sql t-sql sql-server sorting
我坚持一个要求,我尝试了一部分代码,但在某种程度上工作,但没有按照我的要求排序.
需求
如果我有几行按任务分组
Name RowToBeSorted
task1 1
task1 1
task1 1
task2 3
task2 3
task2 3
task3 2
task3 2
task3 2
task4 NULL
task4 NULL
task4 NULL
Run Code Online (Sandbox Code Playgroud)
这是我的要求,排序顺序应显示基于我在上面针对Ex显示的列号的数据组.如果列值为8,则该数据应位于第8个GroupBy位置,如果列值为5,则该数据集应位于第5个GroupBy位置.现在按照表结构,task3的列值为2,那么该组数据应该在第二个位置排序而不管其他顺序,所以输出应该是这样的.
task1 1
task1 1
task1 1
task3 2 <-- positioned at 2nd group by
task3 2 <-- positioned at 2nd group by
task3 2 <-- positioned at 2nd group by
task2 3
task2 3
task2 3
task4 NULL
task4 NULL
task4 NULL
Run Code Online (Sandbox Code Playgroud)
我已经根据列值对数据进行了排序,但问题是当列可以有0或NULL值到达顶部并改变数据的位置时,这是不好的.
无论我从查询获得的数据是什么,都将进一步反映在Crystal Report中.
PS
如果两组或多组数据具有相同的排序编号,则应根据我已经注意的名称对其进行排序,我只需要根据包含NULL的相应列的值来定位行.
如果我足够清楚,请告诉我.
更新1:
我试过,这就是我得到的.我仍然在开头看到NULL并且推送下面的其他数据给我错误的位置,我做错了什么.
SELECT
-- few other columns
SUBSTRING(UDF.[R/L], PATINDEX('%[0-9]%', UDF.[R/L]), LEN(UDF.[R/L])) RL_Num
,QEmployeeAll.FirstName + ' ' + QEmployeeAll.LastName AS EmployeeName
from tableName
WHERE SchedData.AssignDate = @Date
GROUP BY QEmployeeAll.FirstName ,QEmployeeAll.LastName, AssignDate
,CASE WHEN SUBSTRING(UDF.[R/L], PATINDEX('%[0-9]%', UDF.[R/L]), LEN(UDF.
[R/L])) IS NULL THEN 1 ELSE 0 END
ORDER BY RL_Num, EmployeeName ;
Run Code Online (Sandbox Code Playgroud)
RL_Num是我的排序值.
这是我的输出窗口:
更新2:
我弄清楚我的代码出了什么问题,谢谢它帮助了我,现在我可以根据你的片段进行排序,但是我仍然没有达到我的要求,这里是屏幕截图和解释.
如果您看到前3行是正确的,因为排序顺序是1,接下来3行值3,所以应该放在NULL值之后(RENAMAED07-19),因为只有目标是与NULL或有效值无关,我们只需将这些数据集放在指定的行中.最后一行将位于底部,因为它是不同的任务,并根据名称进行排序.所以输出应该是这样的.
RowsToBeSorted
1
1
1
NULL <-- This position is irrelevant to me
NULL <-- This position is irrelevant to me
NULL <-- This position is irrelevant to me
3 <-- since value is 3rd position
3 <-- since value is 3rd position
3 <-- since value is 3rd position
NULL <-- This position is irrelevant to me
Run Code Online (Sandbox Code Playgroud)
如果它足够清楚,请告诉我.
试试这个:
DECLARE @DataSource TABLE
(
[Name] VARCHAR(12)
,[RowToBeSorted] INT
);
INSERT INTO @DataSource ([Name], [RowToBeSorted])
VALUES ('task1', 1)
,('task1', 1)
,('task1', 1)
,('task2', 3)
,('task2', 3)
,('task2', 3)
,('task3', 2)
,('task3', 2)
,('task3', 2)
,('task4', NULL)
,('task4', NULL)
,('task4', NULL);
SELECT *
FROM @DataSource
ORDER BY CASE WHEN [RowToBeSorted] IS NULL THEN 1 ELSE 0 END
,[RowToBeSorted]
,[Name];
Run Code Online (Sandbox Code Playgroud)

这个想法首先要检查一个RowToBeSorted IS NULL- 如果"是"我们正在返回1,否则0- 这样,NULL值总是在最后,但你也可以Name为他们排序.