Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有修订日期的表上的SQL联接_Sql_Sql Server_Join_Mapping_Revision History - Fatal编程技术网

具有修订日期的表上的SQL联接

具有修订日期的表上的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

我即将开始为我的公司开发一个SQL解决方案,该解决方案要求我根据SKU编号链接产品类别映射。问题是类别映射可能会更改,并且它们将具有与更改关联的日期

例如:

  • 产品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