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

时间:2015-05-18 15:25:02

标签: sql-server join outer-join

我有4个表在MSSQL中使用JOIN查询 1. 销售:ItemID,AreaCode,IndID,成本
2. Ind :AreaCode,IndID,Insite,InLocation
3. ItemPrice :ItemID,AreaID,IndID,ActicationDate,Price
4. 发票:ItemID,IndID,AreaId,InvoiceDate

我希望从表1中获取IndID和AreaCode,因为我想从Ind表中查找记录,并从这些记录中查找Insite和AreaCode,其中InLocation =''来自同一个表。 从那些记录获得IndID。  使用该IndID和ItemID,从ItemPrice表中找到该特定项的价格。该特定项目的价格来自activationDate,适用于基于日期的特定发票。
即如果激活日期是1月1日,价格是5美元 - >而发票日期是2,那么价格是5美元。但如果第二天ActivationDate是1月2日,价格更新为7美元。和发票创建于1月3日,价格应为7美元。

即。

enter image description here

得到这个:
enter image description here
寻找下面的东西
enter image description here

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 

1 个答案:

答案 0 :(得分:0)

终于破解了。

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


结果如下 enter image description here