select Staff_ID, First_Name, Last_Name
from YourTable
order by cast(Staff_ID as varchar(10))+First_Name+Last_Name,
Staff_ID
NULL
giá trị sẽ được đặt hàng đầu tiên.
Khi nối một giá trị với NULL
kết quả là NULL
vì vậy First_Name+Last_Name
sẽ là NULL
nếu có cái nào là NULL
.
cast(Staff_ID as varchar(10))+...
có đảm bảo thứ tự bạn muốn cho trường hợp First_Name+Last_Name
không NULL
(Tôi giả sử là Staff_ID
là int
).
Và đơn đặt hàng thêm theo cột Staff_ID
ở đó để đảm bảo thứ tự bạn muốn cho tất cả các hàng có First_Name+Last_Name
là NULL
Cập nhật
Bạn có thể tạo truy vấn động bằng cách sử dụng INFORMATION_SCHEMA.COLUMNS. Điều này có thể làm những gì bạn muốn. Lưu ý, điều này không được kiểm tra cho tất cả các loại dữ liệu.
declare @TableName sysname = 'YourTable'
declare @Sql nvarchar(max) = 'select * from '+quotename(@TableName)+ ' order by '
select @Sql = @Sql+'+cast('+COLUMN_NAME+' as varchar(max))'
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName
exec (@Sql)
Cập nhật 2
Thay vào đó, một phiên bản không động sử dụng XML.
;with C as
(
select *,
row_number() over(order by (select 1)) as rn
from YourTable
)
select C1.*
from C as C1
cross apply (select *
from C as C2
where C1.rn = C2.rn
for xml path('x'), type) as T(N)
order by T.N.value('count(/x/*)', 'int')
Cập nhật 3
Nếu bạn biết khóa chính của bảng và không ngại nhập mệnh đề where, bạn có thể sử dụng mệnh đề này thay vì sử dụng row_number()
.
select Y1.*
from YourTable as Y1
order by (select *
from YourTable as Y2
where Y1.Staff_ID = Y2.Staff_ID
for xml path('x'), type).value('count(/x/*)', 'int')