SQL按Asc和Desc的混合对列进行排序(按波形排序)

时间:2014-09-08 15:17:43

标签: sql sorting

所以我有两个专栏(公司,类型)

Company Type
Bell    Mobile
Rogers  Mobile
Fido    Mobile
Bell    Mobile
Bell    Home
Fido    Home
Rogers  Home
Bell    Home
Bell    Home
Rogers  Home
Fido    Home
Bell    Mobile
Bell    Mobile
Fido    Mobile
Rogers  Home
Bell    Home
Rogers  Home

我希望它看起来像

Bell    Home
Bell    Home
Bell    Home
Bell    Home
Bell    Mobile
Bell    Mobile
Bell    Mobile
Bell    Mobile
Fido    Mobile
Fido    Mobile
Fido    Home
Fido    Home
Rogers  Home
Rogers  Home
Rogers  Home
Rogers  Home
Rogers  Mobile

第一列只是按升序排序。第二列是asc / desc的混合物。注意第一组公司(贝尔)如何排序为asc,然后当你到达第二组公司(Fido)时,它被排序为desc。然后当你到达第三组时它会回到asc等等......

目前,我没有关于如何对此类型进行排序的线索。但我认为我需要创建两个新列:( CompanySortOrder,每个公司的值为1~3,然后是类型的1,2)请记住这是示例,所以硬编码不可能,因为我期望更多的公司还有更多类型我甚至可能需要以相同的方式或正常的排序方式对第三列进行排序。

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

1 个答案:

答案 0 :(得分:0)

如果您正在使用MS SQL Server或任何其他支持DENSE_RANK()等分区功能的dbms,您可以通过将数据划分为基于Company的组来实现此目的,并根据组%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