SQL列按值排序

Ori*_*gio 0 sql t-sql sql-server multiple-columns

使用T-SQL我正在创建一个临时表格.我需要根据以最大值开头的列的总数对列重新排序.

例如

----    DO  MO  BC  NI  SC
Total   22  44  53  57  24
Prod A  0   24  0   24   0
Prod B  0   0   0   20   7
Prod C  0   20  0   13  13
Run Code Online (Sandbox Code Playgroud)

会成为:

----    NI  BC  MO  SC  DO
Total   57  53  44  24  22
Prod A  24   0  24   0   0
Prod B  20   0   0   7   0
Prod C  13   0  20  13   0
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 8

首先,----如果一个可怕的专栏名称,但我可以想到没有更好的,所以我保留它.

在构建查询字符串时,可以在对列进行排序的位置动态构建查询.

declare @SQL nvarchar(max)

set @SQL = '
select [----]'+
  (
  select ', '+T2.N.value('local-name(.)', 'nvarchar(128)')
  from (
       select DO, MO, BC, NI, SC
       from T
       where [----] = 'Total'
       for xml path(''), type
       ) as T1(X)
  cross apply T1.X.nodes('*') as T2(N)
  order by T2.N.value('.', 'int') desc
  for xml path('')
  )+'
from T'

exec (@SQL)
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

更新

如果您认为构建动态查询的XML版本有点复杂且不直观,则可以使用它,完全没有XML内容.

declare @SQL nvarchar(max)
declare @Col nvarchar(128)

declare C cursor local fast_forward for
  select U.Col
  from (
       select DO, MO, BC, NI, SC
       from T
       where [----] = 'Total'
       ) as T
  unpivot(Val for Col in (DO, MO, BC, NI, SC)) as U
  order by U.Val desc

set @SQL = 'select [----]'

open C
fetch next from C into @Col
while @@FETCH_STATUS = 0
begin
  set @SQL = @SQL + ',' + @Col
  fetch next from C into @Col
end

close C
deallocate C

set @SQL = @SQL + ' from T'

exec (@SQL)
Run Code Online (Sandbox Code Playgroud)

SQL小提琴