【问题标题】:Sorting some query result in a very specific way以非常具体的方式对某些查询结果进行排序
【发布时间】:2019-07-10 02:03:29
【问题描述】:

我需要以这种特定方式对以下查询的结果进行排序:

1) 在第一行中,IdItemIsComplete 值 = 0,并且相同的 IdItem 已经完成了任务 (IsComplete = 1)

2) 其余行按IdItem ASC 排序。

--Current Select
    SELECT 
         IdTask,
         IdTaskDetail,
         IdTask,
         IdItem,
         IsComplete,
         RealQty,
         ProposalQty

         from TaskDetail
    where IdTask = 751
     and IsComplete = 0

             ORDER BY (ProposalQty - RealQty)/ProposalQty ASC, IdItem ASC 

--Creating table and values inside

    CREATE TABLE TaskDetail
    (IdTaskDetail int,
    IdTask int,
    IdItem int,
    IsComplete int,
    RealQty int,
    ProposalQty int)

--Values
insert into TaskDetail (IdTaskDetail, IdTask, IdItem, IsComplete, RealQty, ProposalQty)
values (1642, 751, 10820, 0, 0, 12)

insert into TaskDetail (IdTaskDetail, IdTask, IdItem, IsComplete, RealQty, ProposalQty)
values (1641, 751, 9228, 0, 0, 12)

insert into TaskDetail (IdTaskDetail, IdTask, IdItem, IsComplete, RealQty, ProposalQty)
values (1640, 751, 9228, 0, 0, 12)

insert into TaskDetail (IdTaskDetail, IdTask, IdItem, IsComplete, RealQty, ProposalQty)
values (1643, 751, 10820, 1, 12, 12)

--Current table data

IdTask  IdTaskDetail    IdTask  IdItem  IsComplete  RealQty ProposalQty
751            1641        751   9228   0           0       12
751            1640        751   9228   0           0       12
751            1642        751  10820   0           0       12
751            1643        751  10820   1           12      12

期望的结果应该是这样的(因为有一个 IsComplete = 1 任务与项目 10820):

IdTask  IdTaskDetail    IdTask  IdItem  IsComplete  RealQty ProposalQty
751            1642        751  10820   0           0       12
751            1640        751   9228   0           0       12
751            1641        751   9228   0           0       12

最后两行列具有相同的条件,因此顺序无关紧要。

【问题讨论】:

标签: sql select sql-order-by


【解决方案1】:

您可以使用相关子查询来检查某行是否与IsComplete=1 对应,并根据该行进行排序:

SELECT   IdTask,
         IdTaskDetail,
         IdTask,
         IdItem,
         IsComplete,
         RealQty,
         ProposalQty
FROM     TaskDetail t
WHERE    IdTask = 751 AND IsComplete = 0
ORDER BY CASE WHEN EXISTS (SELECT *
                           FROM   TaskDetail o
                           WHERE  o.IdItem = t.IdItem AND
                                  o.IdItem IsComplete = 1) 
              THEN 0
              ELSE 1
         END,
         IdItem

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多