0

抱歉,我什至不确定如何命名这个问题,所以希望我能描述一下。

我正在尝试使用连接或子查询进行查询,但只是没有点击。我的大脑每分钟都变得糊涂了。

所以,我有一张桌子,上面有每件商品的每日销售额。

然后我有一个表格,其中包含该项目与销售相关的日期范围。

问题是可能有 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
4

2 回答 2

1

未经测试:这可能很接近

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)

不过,我担心的一个问题是子查询的性能,对于最大项目 ID 和按其他值分组,简单地在 salePeriodsandItemcosts 上进行第二次连接可能会更快。

于 2013-05-22T19:32:26.010 回答
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在这里

于 2013-05-22T19:43:28.743 回答