对不起,我甚至不确定如何标题这个问题,所以希望我能描述一下。
我正在尝试使用连接或子查询进行查询,而不是单击。我的大脑一分钟变得越来越模糊。
所以,我有一张每个项目按日销售的表格。
然后我有一张表格,其中包含该项目与销售相关的日期范围。
问题在于,可能有2-3个与项目相关的重叠销售期。但是,销售将永远不会具有相同的结束日期,并且具有最后日期(或最高数字)的销售将在该期间具有该项目的真实成本,即使在前一时期存在不同的成本重叠的。
所以在给定此结构的情况下,我该怎样做才能在一天之内返回该项目的费用?
Item sales by date
-----------
itemID | Sales | Date
---------------------------
1 $4.00 3/29
1 $5.00 4/1
1 $6,00 4/3
Sale Periods and Item Costs
===========================
item ID | StartDate | EndDate | Cost In Period | PeriodID
-----------------------------------------------------------
1 3/27 4/2 $2.00 1
1 4/1 4/16 $1.90 2
您可以看到销售额4/1似乎有两个可能相关的成本,而且我想要使用期末的成本。
所以结果将是
Item sales by date WITH COST
-----------
itemID | Sales | Date | COST
--------------------------------
1 $4.00 3/29 $2.00
1 $5.00 4/1 $1.80
1 $6,00 4/3 $1.80
答案 0 :(得分:1)
UNTESTED: 这可能很接近
SELECT ISBD.itemID, ISBD.Sales, ISBD.Date, SPIC.Cost
FROM ITemSalesByDate ISBD
LEFT JOIN SalePeriodsandItemCosts SPIC
ON SPIC.ItemID = ISBC.ItemID
AND SPIC.EndDate =
(SELECT max(SPIC2.ENDDATE)
FROM SalePeriodsandItemCosts SPIC2
WHERE SPIC2.ItemID = ISBD.ItemID)
我担心的一个问题是,子查询的性能可能更快,只需在salePeriodsandItemcosts上通过其他值进行第二次加入最大项目ID和组。
答案 1 :(得分:1)
假设这是SQLServer,请尝试:
with cte as
(select s.itemID, s.Sales, s.[Date], c.[Cost in Period],
row_number() over (partition by s.itemID, s.[Date]
order by c.EndDate desc) rn
from sales s
join costs c
on s.itemID = c.[item ID] and s.Date between c.StartDate and c.EndDate)
select itemID, Sales, [Date], [Cost in Period]
from cte
where rn=1
SQLFiddle here。