对不起,我甚至不知道如何命名这个问题,所以希望我能描述它。
我试图查询,要么使用联接,要么使用子查询,而有些东西就是没有点击。我的大脑正变得越来越肌肉发达。
所以,我有一张按日销售的桌子。
然后,我有一张表,表上列出了与销售相关的日期范围。
问题是,有可能有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
发布于 2013-05-22 19:32:26
未经测试:这可能很接近
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和组按其他值进行第二次连接可能会更快。
发布于 2013-05-22 19:43:28
假设这是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 这里.
https://stackoverflow.com/questions/16699983
复制相似问题