首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL w/多重条件下的排序

SQL w/多重条件下的排序
EN

Stack Overflow用户
提问于 2013-08-02 13:11:45
回答 2查看 104关注 0票数 1

我对SQL很陌生,我将如何对以下内容进行排序:

我有三种不同类型的dev项目(类型1、2和3)。类型1和2也有一个与它们相关联的分析。分析和dev类型1和2将具有一个链接父id,我将如何与这些规范进行排序:

按以下顺序处理项

  • Dev第3类项目
  • 开发类型1或2项目与其分析项相结合(dev项目列优先于分析项列)
  • 没有相关开发项目的剩余分析项目

*EDIT*下的ParentID应该放在这三种规格之后的第一位

表的示例列是:

代码语言:javascript
复制
|ParentID| AnalysisItemID | DevItemId | DevType |
    1          Null             2          1
    4           5              Null       Null 
    6           8              Null       Null      
    8          Null             9          3  
    6          Null             7          2
    1           3              Null       Null

排序后的输出为:

代码语言:javascript
复制
|ParentID| AnalysisItemID | DevItemId | DevType |
    8          Null             9          3   
    1          Null             2          1
    1           3              Null       Null
    6          Null             7          2 
    6           8              Null       Null 
    4           5              Null       Null
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-02 13:21:43

在我看来,您似乎希望按照父id对数据进行排序,并根据父类的最大devtype排序。

为此,您需要连接到汇总表以获取order by的信息。

代码语言:javascript
复制
select t.*
from t join
     (select parentId, max(devtype) as maxdt
      from t
      group by parentId
     ) p
     on t.parentId = p.parentId
order by (case when maxdt = 3 then 1
               when maxdt in (1, 2) then 2
               else 3
          end), parentId, devtype desc
票数 1
EN

Stack Overflow用户

发布于 2013-08-02 13:17:08

它很难看,但您可以根据CASE在SQL中的结果进行排序。我想象一些类似于:

代码语言:javascript
复制
SELECT * FROM MyTable
   ORDER BY CASE WHEN DevType = 3 THEN 1
                 WHEN DevType IN (1, 2) THEN AnalysisItemID + 1
                 ELSE [bignumber] + AnalysisItemID END

做你想做的事。

显然,如果需要的话,case也可以封装到用户定义的函数中以提高可读性。然而,这有可能会影响性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18017747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档