我遇到了一个要求,我尝试了一部分代码,但在某种程度上有效,但无法根据我的要求进行排序。
要求
如果我有几行按任务分组
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 是我的排序值。
这是我的输出窗口:
更新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
如果它足够清楚,请告诉我。
答案 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];
首先要检查一个RowToBeSorted IS NULL
- 如果“是”我们将返回1
,否则0
- 这样,NULL
值将始终最后,你也可以Name
为他们排序。