我在一个x到多个ys的SQL服务器数据库中有一对多的关系。
当我加入这两个表时,我会得到如下数据:
1x 1x 1y 1y
1x 1x 2y 2y
我得到x数据两次,因为有两个子行与之关联。
问题是我需要对两个表中的列运行求和,并且在每种情况下我只想对每个唯一行列求和一次。因此我想要数据:
1x 1x 1y 1y
null null 2y 2y
我知道这可以很容易地使用子查询完成,但需要考虑性能因素。
感谢。
编辑 -
因为每个人都想要一个更具体的例子:
有一个非常大的订单表放在某种商店。 这些订单可以有折扣。折扣可以应用于多个订单。 每个订单在顶级都有税,运费和折扣总列。 每个订单都有一个子订单项的集合。这些订单商品包含商品价格和销售数量。
对于每个折扣,我想要总销售额。 这将是每个订单与折扣税的总和+每个订单的总和与每个折扣发货+每个订单的总和订单项目价格*数量 - 折扣总额的总和。
所以我有两个需要总结的关卡。订单上的订单和订单商品上的订单。
无法修改表格。
我已经使用子查询得到了正确的数字,但我还必须对求和列进行排序,我发现它非常慢。
我的当前模型组按折扣应用并加入订单和订单商品。它非常有效,但会返回包含多个子项的订单列的重复项。
答案 0 :(得分:3)
如果子查询可以返回所需的结果,则应该使用它。
它总是取决于您的数据库结构和要求。子查询并不总是需要增加开销。
答案 1 :(得分:1)
简单地说,您想要计算每个订单的总成本,然后将按折扣分组的所有订单的总成本相加。
with orderTotals as (
select discountID,
min(tax + shipping - discount) + sum(price * quantity) as total
from orders
join items on orders.orderID = items.orderID
group by discountID, orders.orderID
)
select discountID,
sum(total) as total
from orderTotals
group by discountID
;
您可以将max()或avg()替换为min()并仍然得到相同的结果,因为税,运费和折扣是给定订单的常量。