SQL MULTIPLE JOIN-LEFT OUTER JOIN [查找日期范围内的值]

SQL MULTIPLE JOIN-LEFT OUTER JOIN [Find Values between date range]

我有 4 table 在 MSSQL 中使用 JOIN 查询
1. 销售额:ItemID、AreaCode、IndID、成本
2. Ind: AreaCode, IndID, Insite,InLocation
3. ItemPrice:ItemID、AreaID、IndID、激活日期、价格
4. 发票: ItemID, IndID, AreaId, InvoiceDate

我想从 table 1 中获取 IndID 和 AreaCode,在此基础上我想从 Ind table 中查找记录,并从这些记录中查找 Insite 和 AreaCode with InLocation=' ' from same table. 从该记录中获取 IndID 。 使用该 IndID 和 ItemID,从 ItemPrice Table 中找到该特定项目的价格。该特定项目的价格从激活日期开始适用于基于日期的特定发票。
IE。如果激活日期是 1 月 1 日,价格是 5 美元 --> 发票日期是 2 日,那么价格是 5 美元。但是如果第二天 ActivationDate 是 1 月 2 日并且 Price 更新为 $7。发票是在 1 月 3 日创建的,价格应该是 7 美元。



得到这个:

寻找类似下面的东西

SELECT DISTINCT sl.AreaCode,sl.IndID,sl.cost,
id.IndID, id.AreaCode, id.InLocation, id.InSite,
id2.IndID, id2.AreaCode, id2.InLocation, id2.InSite,
ip.ItemId,ip.price,ip.ActivationDate,
iv.InvoiceDate 
from Sales s                
    LEFT OUTER JOIN  Ind id 
                ON s.IndID= id.IndID
                AND s.AreaCode=id.AreaCode

    LEFT OUTER JOIN Ind id2 
                ON id.AreaCode=id2.AreaCode
                AND id.IndID=id2.IndID
                AND id.InSite=id2.InSite
                AND id.InLocation = '' 

    LEFT OUTER JOIN ItemPrice ip 
                ON s.ItemId=ip.ItemId 
                AND id2.AreaCode=ip.AreaCode
                AND id2.IndID=ip.IndID  

    LEFT OUTER JOIN Invoice iv
                ON s.ItemId=iv.ItemId 
                AND iv.InvoiceDate >= ip.ActivationDate 

终于破解了。

select *, 
   (select top 1 price 
    from itemPrice 
    where itemPrice.ActivationDate <= t.InvoiceDate 
    order by itemPrice.ActivationDate desc) as Price
from Invoice t


这是结果