2017-11-27 15 views
2

私は要件を満たしていますが、コードの一部を試しましたが、ある程度は機能しますが、自分の要件に従ってソートできません。特定の値に基づいてデータをソートSQL

要件

タスクごとにグループ化されて、私はいくつかの行を持っている場合はここ

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。列の値は、列の値が、データのセットが5ソート GROUPBY位置に配置されるべきである場合、データは、8ソートに GROUPBY位置に配置されるべきであること次に言えば。今度はテーブル構造 タスク3の列の値がの場合、そのグループデータは他の順序にかかわらず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レポートにさらに反映されます。

PS

データの2つの以上のセットが、それは私がすでに世話をしてきた名前に基づいてソートされなければならない同じ種類の番号を持っている場合、私はちょうど、それぞれの値に基づいて行を配置する必要があります列にもNULLが含まれています。

私が十分明確であれば教えてください。

UPDATE 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

UPDATE 2:私はあなたのコードが間違って何をしたかを考え出し

、それは私を助けたおかげで、今私ができるソートすることができあなたのスニペットごとに、私はまだ私の要件を達成していない、ここでは、スクリーンショットと説明です。

enter image description here

ソート順序があるので、最初の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 

十分にクリアであれば教えてください。

答えて

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になります。

関連する問題