首页 > 解决方案 > SQL查看问题:来自多个表的条件计算列

问题描述

我在开发使用视图时遇到问题。此视图是三个表之间的连接 - 但是,并非每一行都会有来自所有三个表的值 - 因此是 LEFT JOIN。下面附上代码:

SELECT 
    dbs.ID,
    dbs.OrderID,
    dbs.SystemID,
    dbs.SalesOrderNo,
    dbs.[LineNo],
    dbs.OrderQty,
    dbs.ProductionOrder,
    dbs.Workstation,
    ref.Material,
    ref.MaterialDescription,
    dbs.Date,
    dbs.Status,
    dbs.Operator,
    dbs.StartTime,
    dbs.EndTime,
    dbs.TotalTime,
    SUM(del.DelayTime) AS DelTime,
    ref.BuildTime AS CycleTime,
    dbs.TotalTime - SUM(del.DelayTime) AS BuildTime

FROM
    [Booms DBS] AS dbs 
    LEFT JOIN
    [Booms Delay Entry] AS del
    ON dbs.ID = del.ID 
    LEFT JOIN
    [Booms Reference Master] AS ref
    ON dbs.SystemID = ref.SystemID AND dbs.Workstation = ref.Workstation

GROUP BY
    dbs.ID,
    dbs.OrderID,
    dbs.SystemID,
    dbs.SalesOrderNo,
    dbs.[LineNo],
    dbs.OrderQty,
    dbs.ProductionOrder,
    dbs.Workstation,
    ref.Material,
    ref.MaterialDescription,
    dbs.Date,
    dbs.Status,
    dbs.Operator,
    dbs.StartTime,
    dbs.EndTime,
    dbs.TotalTime,
    ref.BuildTime

在第 18 行和第 20 行中,有基于延迟表中“DelayTime”值的聚合。但是,并非每条记录都与延迟相关联。“BuildTime”是根据“TotalTime”和“DelayTime”值计算的。

但是,似乎当“DelTime”列(DelayTime 的总和)为 NULL(AKA 没有关联的延迟)时,“BuildTime”将不会填充。是否有某种条件我可以添加说明当“DelTime”为 NULL 时,只需根据“TotalTime”填充“BuildTime”?

标签: sql-servertsqlssms

解决方案


如果要添加两个可能为的值,请在值上NULL使用coalesce()。所以:

dbs.TotalTime - coalesce(SUM(del.DelayTime), 0) AS BuildTime

不需要将 tocoalesce()作为参数sum(),因为sum()(像大多数聚合函数一样)忽略null值。


推荐阅读