SQL Server встроенный оператор CASE - PullRequest
0 голосов
/ 29 сентября 2018

Как мне написать запрос, в котором я хочу получить последнее значение?

Например, у меня есть таблица с задачами, 1-4 для каждого родительского рабочего процесса.Затем у меня есть заполненный столбец с 1 или 0.

Я хотел бы вернуть 1 значение, Задача 1 или 2 или 3 или 4, в зависимости от того, завершена ли задача.

Я попробовал встроенный оператор CASE, но он всегда возвращает значение 4.

Должен быть лучший способ.

SELECT 
    Estimate.EstimateID, Estimate.EstimateNo, 
    CASE 
       WHEN TransWorkFlow.OwnerID = Estimate.EstimateID 
          THEN
             CASE 
                WHEN TransWorkFlowDetails.TaskNo = 1 AND TransWorkFlowDetails.Completed = 0 
                   THEN 1
                ELSE 
                   CASE 
                      WHEN TransWorkFlowDetails.TaskNo = 2 AND TransWorkFlowDetails.Completed = 0 
                         THEN 2
                      ELSE 
                         CASE
                            WHEN TransWorkFlowDetails.TaskNo = 3 AND TransWorkFlowDetails.Completed = 0 
                               THEN 3
                            ELSE 
                               CASE 
                                  WHEN TransWorkFlowDetails.TaskNo = 4 AND TransWorkFlowDetails.Completed = 0 
                                     THEN 4
                                  ELSE 4 
                               END 
                         END 
                   END 
             END
       END AS TaskCompleted
FROM 
    TransWorkFlow 
INNER JOIN
    TransWorkFlowDetails ON TransWorkFlow.TransWorkFlowID = TransWorkFlowDetails.TransWorkFlowID 
INNER JOIN
    Estimate ON TransWorkFlow.OwnerID = Estimate.EstimateID

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Кажется, что это можно упростить до одного простого CASE оператора

SELECT 
  e.EstimateID,
  e.EstimateNo,
  CASE WHEN td.Completed = 0 AND td.TaskNo IN (1,2,3,4) THEN td.TaskNo ELSE 4 END AS TaskCompleted
FROM TransWorkFlow t
INNER JOIN TransWorkFlowDetails td ON t.TransWorkFlowID = td.TransWorkFlowID
INNER JOIN Estimate e ON t.OwnerID = e.EstimateID;

Примечание:

  • мы используем псевдонимы, такие как t, tdи e для сокращения кода
  • мы избавились от вашей начальной проверки CASE, поскольку она покрывается INNER JOIN
  • TaskNo, кажется, ваше условие проверки, а такжевывод, давайте можем сослаться на это в THEN часть
0 голосов
/ 29 сентября 2018

Не совсем понятно, что вы пытаетесь сделать здесь, но я думаю, что стену падежных выражений можно упростить до этого.

case when TransWorkFlowDetails.Completed = 0
    AND TransWorkFlowDetails.TaskNo in (1, 2, 3, 4)
    THEN TransWorkFlowDetails.TaskNo
    ELSE
        --whatever you want here
    END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...