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
这是结果
我有 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
这是结果