根据特定值SQL

时间:2017-11-27 07:02:44

标签: sql sql-server sorting tsql

我遇到了一个要求,我尝试了一部分代码,但在某种程度上有效,但无法根据我的要求进行排序。

要求

如果我有几行按任务分组

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

这是我的要求,排序顺序应该根据我在上面针对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

我已经根据列值对数据进行了排序,但问题是当列可以有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 ;

RL_Num 是我的排序值。

这是我的输出窗口:

enter image description here

更新2:

我弄清楚我的代码出了什么问题,谢谢它帮助了我,现在我可以根据你的片段进行排序,但是我仍然没有达到我的要求,这里是屏幕截图和解释。

enter image description here

如果您看到前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

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

1 个答案:

答案 0 :(得分: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];

enter image description here

首先要检查一个RowToBeSorted IS NULL - 如果“是”我们将返回1,否则0 - 这样,NULL值将始终最后,你也可以Name为他们排序。