sql-server - 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
解决方案
似乎这可以简化为一个简单的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
部分参考
推荐阅读
- julia - 如何正确地将值传递给包含的函数?
- java - 在按属性排序之前如何按类型排序
- javascript - Paper.js 缩放变换在 onFrame 事件之外继续
- java - 使用 FirestoreUI 实现搜索
- python - 如何使用 pymupdf 减小修改后 PDF 的大小
- python - 对编码/解码字符串感到困惑。在尝试实施 base64 之前如何进行?
- sql - 在 BigQuery 中,如何汇总匹配相同日期和 ID 的字段?
- amazon-web-services - aws 弹性负载均衡器和限制
- function - 如果将 RawMaterial 与 Textspan 或识别器一起使用,颤振将函数传递给无状态小部件不起作用
- r - ggplot facet_wrap 出错:错误:`scale_id` 不能是 `NA`