【问题标题】:SQL Sort a Column by Mixture of both Asc and Desc (Sort by Waves)SQL 通过混合 Asc 和 Desc 对列进行排序(按 Waves 排序)
【发布时间】:2014-09-08 15:17:43
【问题描述】:

所以我有两列(公司、类型)

公司 类型 贝尔移动 罗杰斯移动 菲多移动 贝尔移动 贝尔之家 菲多之家 罗杰斯之家 贝尔之家 贝尔之家 罗杰斯之家 菲多之家 贝尔移动 贝尔移动 菲多移动 罗杰斯之家 贝尔之家 罗杰斯之家

我希望它看起来像

贝尔之家 贝尔之家 贝尔之家 贝尔之家 贝尔移动 贝尔移动 贝尔移动 贝尔移动 菲多移动 菲多移动 菲多之家 菲多之家 罗杰斯之家 罗杰斯之家 罗杰斯之家 罗杰斯之家 罗杰斯移动

第一列只是按升序进行的常规排序。第二列是 asc/desc 的混合。注意第一组公司(Bell)是如何按升序排列的,然后当你到达第二组公司(Fido)时,它是按降序排列的。然后当你到达第三组时,它又回到了 asc 等等......

目前,我不知道如何对这种类型进行排序。但我认为我需要创建两个新列:(CompanySortOrder,每个公司的值在 1~3 之间,然后类型为 1,2)请记住,这是示例,因此无法进行硬编码,因为我希望有更多公司还有更多类型,我什至可能需要以相同的方式或正常的排序方式对第三列进行排序。

编辑:我还想补充一点,对第二列 Type 进行排序也可以从 Desc 开始,然后是 Asc 等等

【问题讨论】:

  • 严格交替?你怎么知道第二列应该start升序还是降序?
  • 首先按列排序,按 asc 或 desc 或交替排序(无论是开始还是 asc 或 desc)是动态的
  • 我有两个下拉列表(第一个列表是我要排序的列)和下拉列表(按 asc 或 desc)和第三个复选框(这确定排序是否交替以及是否以 asc 或 desc 开头,由选择第二个下拉列表给出)。还。很明显,第一列变量,你不能通过交替排序。因此,用户将能够根据各自的条件添加另一个排序变量

标签: sql sorting


【解决方案1】:

如果您使用 MS SQL Server 或任何其他支持分区功能(如 DENSE_RANK())的 dbms,您可以通过根据公司将数据分成组并根据组 % 2 = 0 (也就是说,如果它是偶数或奇数)。

SELECT * FROM YourTable
ORDER BY Company ASC,
CASE (DENSE_RANK() OVER (ORDER BY COMPANY) % 2) WHEN 1 THEN Type END ASC, 
CASE (DENSE_RANK() OVER (ORDER BY COMPANY) % 2) WHEN 0 THEN Type END DESC

可能还有其他更有效的方法来实现这一点,但这是首先想到的。

第三列可能看起来像这样(为了清楚起见,我将查询包装在 CTE 中):

;WITH sorted AS (
    SELECT *, 
        Sort1 = DENSE_RANK() OVER (ORDER BY COMPANY) % 2,
        Sort2 = DENSE_RANK() OVER (ORDER BY COMPANY, Type) % 2 
    FROM YourTable
    )
SELECT * FROM sorted
ORDER BY Company ASC,
CASE Sort1 WHEN 1 THEN Type END ASC, 
CASE Sort1 WHEN 0 THEN Type END DESC,
CASE Sort2 WHEN 0 THEN Type END ASC, 
CASE Sort2 WHEN 1 THEN Type END DESC

【讨论】:

  • 太棒了,它有效。我从来没有想过它可以是那么简单的查询。如果我要引入第三列怎么办,我还需要按交替排序
  • 如果您想添加第三列,您应该能够添加另一个级别的分区。我会更新我的答案。
  • like this: "SELECT [Company],[Type],[Function] FROM {Sheet1} ORDER BY Company ASC, CASE (DENSE_RANK() OVER (ORDER BY [Company]) % 2) WHEN 1 THEN [Type] END ASC, CASE (DENSE_RANK() OVER (ORDER BY [Company]) % 2) WHEN 0 THEN [Type] END DESC, CASE (DENSE_RANK() OVER (ORDER BY [Type]) % 2) WHEN 1 THEN [Function] END DESC, CASE (DENSE_RANK() OVER (ORDER BY [Type]) % 2) WHEN 0 THEN [Function] END ASC"
  • 类似的,是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
相关资源
最近更新 更多