Sql 限制联接结果
我为这个模糊的问题道歉,如果以前有人问过这个问题,我很难清楚地表达这个问题 我有三张桌子;批次和销售订单,以及订单批次:Sql 限制联接结果,sql,join,Sql,Join,我为这个模糊的问题道歉,如果以前有人问过这个问题,我很难清楚地表达这个问题 我有三张桌子;批次和销售订单,以及订单批次: Lot SKU CreationDate ------------------------- 1000-a 1000 2017-04-12 1000-b 1000 2017-04-13 2000-a 2000 2017-04-12 2000-b 2000 2017-04-13 SalesorderID Revenue -------
Lot SKU CreationDate
-------------------------
1000-a 1000 2017-04-12
1000-b 1000 2017-04-13
2000-a 2000 2017-04-12
2000-b 2000 2017-04-13
SalesorderID Revenue
-----------------------------
1 $500
2 $250
3 $125
OrderLotID SalesorderID Lot
------------------------------
1 1 1000-a
2 1 2000-a
3 2 1000-b
4 2 2000-b
5 3 1000-a
我想做一个连接,根据SalesOrder中批次的创建日期,它会给我产生的总收入
例如,我想使用2017-04-12的CreationDate,得到625美元的结果(1000-a和2000-a批次是在这个日期创建的,它们用于“填充”SalesOrderID 1和3)。但是我当前使用的连接返回Salesorder 1中的两行和Salesorder 3中的一行,结果是1125美元
如何限制从OrderLot返回的行,以便只计算唯一的Salesorder收入
谢谢
杰夫
编辑。当前查询为:
select sum(so.revenue)
from salesorder so
inner join orderlot ol on so.lot = ol.lot
inner join lot l on ol.lot = l.lot
where l.creationdate = '2017-04-12'
或
我发现第二个选项中的
IN()
条件稍微容易理解,但我倾向于在可能的情况下使用JOIN
,因为根据我的经验,它的性能会更好一些,更容易适应更复杂的情况。和往常一样,如果性能如此重要,您应该实际分析查询并查看执行计划。优化器总是会让您大吃一惊。您尝试的查询将有助于了解需要更正的内容,因此salesOrderID1的总收入为500,而您不知道按批次存在哪些收入?正确。实际问题是:给定一个生产日期,我产生了多少收入。订单上“装满”了很多。因此,我需要获得在给定日期生产的所有订单的收入。我考虑使用distinct进行子查询,但由于某些原因,这似乎不正确。我不知道为什么我会在意(这只是我正在写的一个小工具),但我认为可能有一种方法可以避免使用“独特的”。你可以总是使用“分组方式”。
SELECT SUM(s.Revenue)
FROM SalesOrder s
INNER JOIN (
SELECT DISTINCT SalesOrderID
FROM Lot l
INNER JOIN OrderLot ol on ol.Lot = l.Lot
WHERE l.CreationDate = @CreationDate
) t ON T.SalesOrderID = s.SalesOrderID
SELECT SUM(s.Revenue)
FROM SalesOrder s
WHERE s.SalesOrderID IN (
SELECT DISTINCT SalesOrderID
FROM Lot l
INNER JOIN OrderLot ol on ol.Lot = l.Lot
WHERE l.CreationDate = @CreationDate
)