2017-04-21 72 views
1

對於模糊的問題表示歉意,如果之前有人問過這個問題,我很難弄明白這個問題。限制加入的結果

我有三張表;地段和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的創建日期並獲得625美元的結果(批量1000-a和2000-a是在此日期創建的,並且它們用於「填充」 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

您嘗試的查詢將有助於瞭解需要更正的信息 – Degan

+0

因此,銷售總額爲500 for salesOrderID1,您不知道按批次存在哪些收入? – xQbert

+0

正確。實際問題是:給定生產日期的收入是多少。訂單被「填充」很多。所以我需要獲得在特定日期生產的所有訂單的收入。 – JeffO

回答

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瘦可能的情況下,因爲它往往在我的經驗中表現得更好一些,並且更容易適應更復雜的事情。和往常一樣,如果性能非常重要,您應該實際分析查詢並查看執行計劃。優化器可以讓你感到驚訝。

+0

我想過使用不同的子查詢,但由於某種原因,這看起來不正確。不知道爲什麼我在乎(這只是我正在寫的一個小工具),但我認爲可能有一種方法可以避免使用「獨特」。 – JeffO

+0

您可以隨時使用「GROUP BY」。 –