首页 > 解决方案 > SQL Server 嵌入式 CASE 语句

问题描述

我该如何编写一个查询来获取最后一个值?

例如,我有一个带有任务的表,每个父工作流有 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

标签: sql-servertsql

解决方案


似乎这可以简化为一个简单的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部分参考

推荐阅读