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)
首先,----如果一个可怕的专栏名称,但我可以想到没有更好的,所以我保留它.
在构建查询字符串时,可以在对列进行排序的位置动态构建查询.
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)
更新
如果您认为构建动态查询的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)