T-SQL:按列排序,而不是每一行都包含数据

时间:2018-05-04 10:40:22

标签: sorting tsql

我的样本数据如下:

    taskname  |skillname |user  |Partition
    --------------------------------------
    taskAAAA  |skill1111 |user3 |1   
              |skill2222 |      |1  
    taskBBBB  |skill1111 |user2 |2  
    taskCCCC  |skill3333 |user1 |3 
    taskDDDD  |skill1111 |user4 |4   
              |skill2222 |      |4 

如果有两项技能属于某项任务,则taskname和user将不会在taskname列和用户列中重复。

我设法将分区放到同一个任务名称。但我需要按用户按升序排序,记录将遵循其分区。这种情况的结果如下:

    taskname  |skillname |user  |Partition
    --------------------------------------
    taskCCCC  |skill3333 |user1 |3
    taskBBBB  |skill1111 |user2 |2 
    taskAAAA  |skill1111 |user3 |1   
              |skill2222 |      |1
    taskDDDD  |skill1111 |user4 |4   
              |skill2222 |      |4   

任何人都可以帮助我?

2 个答案:

答案 0 :(得分:0)

第一个选项是使用Order By关键字和NULLS LAST

select * from table order by user NULLS LAST

如果您的SQL不支持NULLS,您可以使用值IS NULL表达式

select * from table order by user IS NULL, user

如果用户的字段为null,则表达式IS NULL返回1,否则为0.因此,非空值(0)的行将是第一个,而具有空值(1)的行将是最后一个升序排序。
下一行将按用户字段的值排序。

答案 1 :(得分:0)

ANSI SQL支持NULLS LAST

order by user nulls last

并非所有数据库都支持此构造。它可以通过双键搜索轻松取代:

order by (case when user is not null then 1 else 2 end),  -- "NULLS LAST"
         user