0

使用 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

会成为:

----    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
4

3 回答 3

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)

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)

SQL小提琴

于 2013-04-12T20:35:52.453 回答
1

如果是临时表,您可以:

  1. 创造它
  2. 计算列顺序
  3. 以正确的顺序创建另一个表
  4. 插入该表(以正确的顺序)

但我还是要问为什么?

您知道您可以在 select 语句中对列进行排序吗?

不知道如何对列求和吗?

select sum(col1), sum(col2) 
from #temp
于 2013-04-12T20:05:38.167 回答
0

不幸的是,您无法重新排序 SQL 中的列。

于 2013-04-12T18:56:04.650 回答