First of, ---- if a terrible column name but I could think of no better for this so I kept it.
You can build the query dynamically where you sort the columns when you build the query string.
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)
SQL Fiddle
Update
If you think the XML version of building the dynamic query is a bit complicated and unintuitive you can use this instead, totally void of XML stuff.
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)
SQL Fiddle
---- DO MO BC NI SC) values or column names?