【问题标题】:SQL column sorting by valueSQL 列按值排序
【发布时间】:2013-04-12 18:54:12
【问题描述】:

我正在使用 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

【问题讨论】:

  • 也许您可以将案例逻辑包含在一个函数中。
  • 你是如何创建第一个表的?
  • 这些是 (---- DO MO BC NI SC) 值还是列名?

标签: sql sql-server tsql multiple-columns


【解决方案1】:

首先,---- 如果是一个糟糕的列名,但我想不出更好的办法,所以我保留了它。

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

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

更新

如果您认为构建动态查询的 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 Fiddle

【讨论】:

  • 我接受这个,因为它会起作用。它不适合我,因为我受限的 SQL 环境不允许我执行 EXEC 或调用另一个存储过程。由于所有元素都包含在列中(包括标题),我将把每个元素指定为一个字符串,左边的部分是排序值,右边的部分是显示值。所以,有点像多维字符串数组。对我来说,这比做很多其他事情要容易。
【解决方案2】:

如果是临时表,您可以:

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

但我还是要问为什么?

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

知道如何对列求和吗?

select sum(col1), sum(col2) 
from #temp

【讨论】:

    【解决方案3】:

    很遗憾,您无法在 SQL 中重新排序列。

    【讨论】:

    • 你可以用一些狂野的 PIVOT/UNPIVOT 的东西来做到这一点,但是......是的,这不是一个热门的想法。
    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    相关资源
    最近更新 更多