【问题标题】:Custom order by in SQL ServerSQL Server 中的自定义排序依据
【发布时间】:2019-05-17 14:02:02
【问题描述】:

下面是select语句

select * 
from #final
order by 
    case  
       when [Col1] in (select top 10 [Col1] from #take order by [Col2] desc) 
          then 0
          else 2
    end

我上面的select语句返回的结果如下

            Col1                              Col2
            --------------------------------------
            App                              86748
            AppService                         832
            BK                               21227
            Cap                             160272
            Fukusima                          1634
            McBaa                             1727
            Others                            6718

但是,我想得到这个结果:

            Col1                              Col2
            --------------------------------------
            Cap                             160272
            App                              86748
            BK                               21227
            McBaa                             1727
            Fukusima                          1634
            AppService                         832
            Others                            6718

如何做到这一点?谢谢。

【问题讨论】:

  • 您的排序逻辑与您认为的不太一样。它正在获取 Col2 的前 10 行,并将它们按某种顺序排列,然后按某种顺序排列其余数据。为什么我说“一些命令”?因为那两组数据根本没有排序。您需要按顺序排列第二列。第二列可能需要另一个 case 表达式才能在最后得到你想要的值。
  • 我认为:结束,[Col2] desc 会起作用..让我试试。
  • 如果“AppService”和“Others”不在前 10 个查询中,这可能会起作用。但我们不知道,因为您没有提供样本数据。

标签: sql-server tsql sql-server-2017


【解决方案1】:

您只是区分了这两种类型,但在该类型 0 中,没有二阶方法。只需将 Col1 添加为二阶,降序即可。

select * from #final
        order by 
        case when [Col1] in (select top 10 [Col1] from #take order by [Col2] desc) then 0
        else 2
        end, [Col2] desc

【讨论】:

    【解决方案2】:

    如下表结构

    CREATE TABLE final
        ([col1] varchar(10), [col2] int)
    ;
    
    INSERT INTO final
        ([col1], [col2])
    VALUES
        ('App', 86748),
        ('AppService', 832),
        ('BK', 21227),
        ('Cap', 160272),
        ('Fukusima', 1634),
        ('McBaa', 1727),
        ('Others', 6718)
    ;
    

    下面的查询会给出准确的结果

    select * from final
            order by 
            case when [Col1] in (select top 6 [Col1] from final order by [Col1] asc) then Col2 
            end desc, 
            [Col1] asc
    
    
    col1       |    col2
    -----------------------
    Cap        |    160272
    App        |    86748
    BK         |    21227
    McBaa      |    1727
    Fukusima   |    1634
    AppService |    832
    Others     |    6718
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      相关资源
      最近更新 更多