对于模糊的问题道歉,如果以前曾经问过这个问题,我很难搞清楚这个问题。
我有三张桌子; Lot和Salesorder以及OrderLot:
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,并且他们已经习惯了&# 34;填写" SalesorderIDs 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'
答案 0 :(得分:1)
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
OR
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
)
我发现IN()
条件的第二个选项稍微容易理解,但我倾向于尽可能倾向于JOIN
,因为它往往会在我的经验中表现更好一些,并且更容易适应更复杂的东西。和往常一样,如果性能非常重要,您应该实际分析查询并查看执行计划。优化器总能给你带来惊喜。