根据特定值SQL对数据进行排序

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)

如果它足够清楚,请告诉我.

got*_*tqn 6

试试这个:

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为他们排序.