我如何实现这一结果?我需要的是在产品由组件组成时计算产品的总成本。对我而言,如果客户选择了一项名为“交付”的服务,我应该在总成本上增加100美元。
这是我到目前为止所尝试过的。
Select Sum(Component.Cost*ProductComponent.Quantity) as TotCost from ProductComponent Left Join Component on ProductComponent.ComponentId = Component.ComponentId
我猜这会让我得到一个产品的总成本。
现在有另一个表Service与Order有很多关系。订单与服务有很多关系。我需要的是如果在服务中使用“交付”,我需要再增加100美元的总费用。
我附上了数据库结构的ER图。我希望我的问题很明确。
答案 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表中添加字段会很有用,以避免在代码/查询中出现魔术常量