【问题标题】:MS SQL ORDER BY ASC then DESC for addressesMS SQL ORDER BY ASC 然后 DESC 获取地址
【发布时间】:2016-12-31 21:19:57
【问题描述】:

我想在街道上订购结果,然后返回另一边进行现场审查工作流程(100、102、104、105、103、101)。

我有:

ORDER BY 
    s.situs_street, 
    CAST([situs_num]%2 as integer), 
    CAST(situs_num as integer)

这让我得到了所有的偶数,然后是赔率,但它们都在上升。

使用:

ORDER BY
    s.situs_street, 
    CAST([situs_num]%2 as integer) ASC, 
    CAST(situs_num as integer) DESC

将偶数/奇数降序排列。使用CASE 语句也失败了,因为我正在对同一字段进行反向排序。

【问题讨论】:

  • 你能解释一下排序的逻辑吗?我还是看不懂
  • @KannanKandasamy 在赔率之前偶数,然后偶数在上升,赔率在下降。

标签: sql sql-server sql-server-2008 sorting


【解决方案1】:

使用case 表达式通过先放置偶数然后放置奇数来对列进行排序。在已分类的组中,对 situs_num 再使用一种排序即可获得所需的结果。

order by 
 s.situs_street
,case when cast([situs_num] as int)%2 = 0 then 1 else 2 end
,case when cast([situs_num] as int)%2 = 0 then cast([situs_num] as int) 
 else -cast([situs_num] as int) end

Sample demo

或更简单(如马特建议的那样)

order by 
 s.situs_street
,cast([situs_num] as int)%2 --ordered by return value 0's first(even) and 1's next (odd)
,case when cast([situs_num] as int)%2 = 0 then cast([situs_num] as int) 
 else -cast([situs_num] as int) end

【讨论】:

  • 他想走上偶数和下奇数
  • @Matt..i 忽略了这一点。我现在更改了查询。谢谢
  • 我想我比我更喜欢你的,但只是为了简化你实际上并不需要你的余数的情况,因为偶数 104%2 永远是 0 奇数 101%2, 105 %2 永远是 1
【解决方案2】:
ORDER BY s.situs_street
          ,CASE WHEN [situs_num]%2 = 0 THEN situs_num ELSE 9999999 END ASC
          ,CASE WHEN [situs_num]%2 <> 0 THEN situs_num ELSE -1 END DESC

如果您可以在不先转换的情况下获取 situs_num 的剩余部分,那么它已经是数字了。如果不是,您将不得不按以下方式进行不同的投射

ORDER BY s.situs_street
          ,CASE WHEN CAST([situs_num] AS INT)%2 = 0 THEN  CAST([situs_num] AS INT) ELSE 9999999 END ASC
          ,CASE WHEN CAST([situs_num] AS INT)%2 <> 0 THEN  CAST([situs_num] AS INT) ELSE -1 END DESC

【讨论】:

  • 谢谢,这是一个巨大的帮助。 -保罗
猜你喜欢
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2020-03-09
  • 2011-04-22
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多