我有一个表格,用于提取SSRS中的订单详细信息,该详细信息在产品编号的价格发生变化时。它有数据更改和更新成本。
我正在配对两个不同的表来创建一个报告,该报告是订单时包裹的成本。以下是我提取数据的方法:
point
目录= ShippedOrders
ActPkgCostHist表具有物品的成本和成本的变化日期。
OrderHist Table除了购买时的ActPkgCost外,还有订单的完整详细信息。
我正在尝试创建一个表,其中包含订单号,订单日期和订单时的包装成本。
答案 0 :(得分:0)
ROW_NUMBER
函数对于这样的情况非常有用。
SELECT WAREHOUSE.ActPkgCostHist.ItemNo AS [ActPkgCostHist ItemNo]
,WAREHOUSE.ActPkgCostHist.ActPkgCostDate
,WAREHOUSE.ActPkgCostHist.ActPkgCost
,ORDER.OrderHist.OrderNo
,ORDER.OrderHist.ItemNo AS [OrderHist ItemNo]
,ORDER.OrderHist.DispenseDt
FROM ORDER.OrderHist
INNER JOIN (
SELECT ItemNo, ActPkgCostDate, ActPkgCost
, ROW_NUMBER() OVER (PARTITION BY ItemNo ORDER BY ActPkgCostDate DESC) as RN
FROM WAREHOUSE.ActPkgCostHist
--if there are future dated changes, limit ActPkgCostDate to be <= the current date
) ActPkgCostHist on ActPkgCostHist.ItemNo = OrderHist.ItemNo
WHERE RN = 1
此子查询的作用是按ItemNo
对费用历史记录进行分组。然后对于每一个,它按新近度对更改进行排名,最近的更改为1.然后在主查询中将其过滤为只有1的行。
答案 1 :(得分:0)
对于每个订单中的每件商品,您必须找到最新的成本日期,并在加入成本表时使用它
SELECT C.ItemNo AS [ActPkgCostHist ItemNo],
C.ActPkgCostDate,
C.ActPkgCost,
O.OrderNo,
O.ItemNo AS [OrderHist ItemNo],
O.DispenseDt
FROM WAREHOUSE.ActPkgCostHist AS C
-- JOIN order detail with cost table in order to define the cost date per item/order
INNER JOIN (SELECT Max(CH.ActPkgCostDate) AS ItemCostDate,
OH.OrderNo,
OH.ItemNo,
OH.DispenseDt
FROM WAREHOUSE.ActPkgCostHist AS CH
INNER JOIN ORDER.OrderHist AS OH
ON CH.ItemNo = OH.ItemNo
-- Get the latest cost date only from dates before order date
WHERE CH.ActPkgCostDate <= OH.DispenseDt
GROUP BY OH.OrderNo,
OH.ItemNo,
OH.DispenseDt) AS O
ON C.ItemNo = O.ItemNo
AND C.ActPkgCostDate = O.ItemCostDate
&#13;