Сортировка некоторого результата запроса очень специфическим способом - PullRequest
0 голосов
/ 10 июля 2019

Мне нужно отсортировать результат этого запроса следующим образом:

1) в первой строке IdItem со значением IsComplete = 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

последние два столбца имеют одинаковые критерии, поэтому не имеет значения порядок.

1 Ответ

1 голос
/ 10 июля 2019

Вы можете использовать коррелированный подзапрос, чтобы проверить, имеет ли строка соответствующую строку с 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
...