SQL查询添加到总和if .. else不添加

时间:2014-05-17 12:22:07

标签: sql sql-server database

我如何实现这一结果?我需要的是在产品由组件组成时计算产品的总成本。对我而言,如果客户选择了一项名为“交付”的服务,我应该在总成本上增加100美元。

这是我到目前为止所尝试过的。

Select Sum(Component.Cost*ProductComponent.Quantity) as TotCost from ProductComponent Left Join Component on ProductComponent.ComponentId = Component.ComponentId 

我猜这会让我得到一个产品的总成本。

现在有另一个表Service与Order有很多关系。订单与服务有很多关系。我需要的是如果在服务中使用“交付”,我需要再增加100美元的总费用。

我附上了数据库结构的ER图。我希望我的问题很明确。

enter image description here

2 个答案:

答案 0 :(得分:0)

基本思想是,如果给定订单的Service表中有记录,则必须在其中添加一个case语句以添加$ 100。下面的查询应该可以帮助您完成大部分工作,但是查看关系的基数,您可能需要对结果进行分组或使用子查询将其删除为一行。

SELECT CASE WHEN sa.ServiceID IS NOT NULL THEN SUM(Component.Cost*ProductComponent.Quantity) +    100
    ELSE SUM(Component.Cost*ProductComponent.Quantity) END AS TotCost 
FROM ProductComponent pc
LEFT JOIN Component on ProductComponent.ComponentId = Component.ComponentId 
JOIN OrderLine o ON o.ProductID = pc.ProductID
JOIN StaffAssignment sa ON sa.SaleID = o.SaleID

看起来多个StaffAssignments可以为一个订单提供服务,因此您可能希望使用像SELECT Top 1 ServiceID FROM StaffAssignment WHERE SaleID = o.SaleID AND ServiceID IS NOT NULL这样的子查询

我目前没有时间对此进行测试,但希望它能为您提供一些解决方案。

答案 1 :(得分:0)

您可以将该服务视为另一种产品,并使用UNION

将其添加到已存在的产品中
SELECT TotCost = SUM(LineCost)
FROM   (SELECT c.Cost * pc.Quantity as LineCost 
        FROM   OrderLine ol
               INNER JOIN ProductComponent p ON ol.ProductID = pc.ProductID
               LEFT  JOIN Component c on pc.ComponentId = c.ComponentId
        Where  ol.SaleID = @ID
        UNION ALL  
        SELECT 100
        FROM   StaffAssignment sa
               INNER JOIN Service s ON sa.ServiceID = s.ServiceID
        Where  Name = 'Delivery'
          And  sa.SaleID = @ID) a

如果服务具有平坦值,则在Services表中添加字段会很有用,以避免在代码/查询中出现魔术常量