具有修订日期的表上的SQL联接
我即将开始为我的公司开发一个SQL解决方案,该解决方案要求我根据SKU编号链接产品类别映射。问题是类别映射可能会更改,并且它们将具有与更改关联的日期 例如:具有修订日期的表上的SQL联接,sql,sql-server,join,mapping,revision-history,Sql,Sql Server,Join,Mapping,Revision History,我即将开始为我的公司开发一个SQL解决方案,该解决方案要求我根据SKU编号链接产品类别映射。问题是类别映射可能会更改,并且它们将具有与更改关联的日期 例如: 产品1当前映射到类别A 用户意识到它是 映射错误,并将产品1映射更改为类别B 2018年1月1日之后的所有交易 另一个用户决定将产品1映射到类别C,但仅适用于2019年2月1日之后的交易。 等等 最后,我需要将一个产品的销售额分配给它在销售发生时所处的类别 我想我可以像下面这样加入: SELECT A.TransactionDa
- 产品1当前映射到类别A
- 用户意识到它是 映射错误,并将产品1映射更改为类别B 2018年1月1日之后的所有交易李>
- 另一个用户决定将产品1映射到类别C,但仅适用于2019年2月1日之后的交易。 等等
SELECT
A.TransactionDate,
A.Product,
B.Category,
SUM(A.Sales) AS TotalSales
FROM Products AS A
JOIN CategoryMappings AS B ON
A.Product=B.Product AND
A.TransactionDate>=B.RevisionDate
GROUP BY A.TransactionDate, A.Product, B.Category
这假设我得到了每个月的销售额和类别映射,每个月的交易过账到月末日期(“2018年1月31日”、“2019年4月30日”等)。不幸的是,如果只有一个映射更改,则此联接仅适用于最新的事务,但是如果有三个或更多的映射更改,如示例中所示,该怎么办?如果我想看到2018年的销售情况,特别是2018年的地图,因为它夹在其他两个地图之间
我以前使用过堆栈溢出,但这是我的第一个问题,所以如果它缺少信息或格式不正确,请原谅
谢谢你能给予的任何帮助 如果无法根据样本数据进行验证,则无法确定 但是我假设一个不存在的版本可以限制到最近的版本
SELECT
P.TransactionDate,
P.Product,
CatMap1.Category,
SUM(P.Sales) AS TotalSales
FROM Products AS P
JOIN CategoryMappings AS CatMap1
ON CatMap1.Product = P.Product
AND CatMap1.RevisionDate <= P.TransactionDate
WHERE NOT EXISTS
(
SELECT 1
FROM CategoryMappings AS CatMap2
WHERE CatMap2.Product = P.Product
AND CatMap2.RevisionDate <= P.TransactionDate
AND CatMap2.RevisionDate > CatMap1.RevisionDate
)
GROUP BY P.TransactionDate, P.Product, CatMap1.Category
嗨,Tyler,我将设计映射表,使其具有datefrom和dateto字段,以便您始终能够确保映射允许您及时移动谢谢您的评论。不幸的是,我不是一个设计师。我正在等待访问服务器,但有人告诉我这是设置,我知道这是最终需要做的。我当然希望这就是它的格式。如果是,查询将如何编写?我在脑子里想这个问题,我只能为映射的每个特定部分而不是整个表计算出来。在您的查询中,您说的是
A.TransactionDate>=B.RevisionDate
,但这似乎是一个缺陷,因为在您的示例中,您显示了产品1在2018年1月1日至2019年2月1日期间是如何属于B类的。你怎么解释呢?这就是我要问的问题。我只能找到一种方法,在只有两个地图的情况下提取最新的地图。我需要它更灵活。样本数据和期望的结果会非常有帮助。@TylerH-Thx。顺便说一句,我更喜欢交叉申请。考虑同一日期的2次修订情况。但是如果RevisionDate
不是日期时间,那么它可能需要在ORDER BY中添加一个额外字段。F.e.CM.Id
SELECT
P.TransactionDate,
P.Product,
CatMap.Category,
SUM(P.Sales) AS TotalSales
FROM Products AS P
CROSS APPLY
(
SELECT TOP 1 CM.Category
FROM CategoryMappings AS CM
WHERE CM.Product = P.Product
AND CM.RevisionDate <= P.TransactionDate
ORDER BY CM.RevisionDate DESC
) CatMap
GROUP BY P.TransactionDate, P.Product, CatMap.Category