SQL 使用日期范围从另一个表返回数据以放入列中

Posted

技术标签:

【中文标题】SQL 使用日期范围从另一个表返回数据以放入列中【英文标题】:SQL working with date ranges to return data from another table to place in a column 【发布时间】:2021-10-07 01:06:15 【问题描述】:

我有一个销售交易数据表,返回每个销售交易的交易日期。

注意:我正在使用的数据库中的交易日期为 INT 格式

原始表格

Transaction Date Order No Order Type Season
2018-02-04 123456 MOI
2018-02-04 789012 EDI
2018-02-04 987654 POS
2018-02-04 235687 POS

在一个单独的表格中,我有一个销售季节和销售季节可以应用于销售交易的日期范围(以下只是示例数据,而不是实际表格数据,只是为了演示表格的外观)。

赛季表

Season From Date To Date
SS22 2018-02-04 2018-01-01
FW21 2018-02-05 2018-01-02
HO21 2018-02-05 2018-01-03
SS20 2018-02-05 2018-01-03

期望的结果将在原始表的 SEASON 列中,以根据交易日期以及交易是否介于季节表中的 FROM 和 TO 日期之间来选择需要哪个季节

更新原始表

Transaction Date Order No Order Type Season
2018-02-04 123456 MOI FW21
2018-02-04 789012 EDI SS21
2018-02-04 987654 POS HO21
2018-02-04 235687 POS

我不知道从哪里开始,但我确实找到了一些东西,并且想知道这是否是查看所需语句的最优化方式,或者是否有更好的方法。

DECLARE @TRANSACTIONDATE AS DATETIME


SELECT CASE 
    WHEN @TRANSACTIONDATE  BETWEEN '2017-01-01' AND '2017-03-31' THEN 'SS22'
    WHEN @TRANSACTIONDATE  BETWEEN '2017-04-01' AND '2017-06-31' THEN 'FW21'
    WHEN @TRANSACTIONDATE  BETWEEN '2017-07-01' AND '2017-09-31' THEN 'SS20'
    WHEN @TRANSACTIONDATE  BETWEEN '2017-10-01' AND '2018-12-31' THEN 'HO21'
    ELSE 'FW21?'
    END AS SEASON

【问题讨论】:

你为什么要这样做?将与Season 相关的信息保留在Season 表中,您可以而且应该始终按日期进行查找。我也会担心您将日期存储为int,您可以像这样转换它们DATEFROMPARTS(d / 10000, d / 100 % 100, d % 100) @Charlieface 那是我的意图。对不起,如果我以其他方式描述的方式进行沟通。我们没有像 ERP 数据库那样将日期存储在 INT 中。是的,我们在需要时转换日期,是的,我将转换我正在开发的查询中的日期,我将在其中使用此语句。 【参考方案1】:

要更新同一个表中的列,您可以使用带有 SELECT 子查询的 SQL UPDATE 来获取 Season 列值(来自 [Season_Table] 查找表), 然后更新到原始交易表[Transaction_Table]中的Season列:

  UPDATE [Transaction_Table]
  SET [Season] = (SELECT Season FROM [Season_Table] s
                  WHERE s.From_Date <= [Transaction_Table].TransactionDate AND 
                        s.To_Date >= [Transaction_Table].TransactionDate)

这避免了必须使用 CASE 语句。

如果使用 SQL 服务器 T-SQL,有许多有用的示例和语法描述 SELECT UPDATE https://docs.microsoft.com/en-us/sql/t-sql/queries/update-transact-sql?view=sql-server-ver15

【讨论】:

***.com/users/12410533/andrew-halil 您的建议比我最初为更新原始表格而设置的建议效果更好。我现在设置了一个存储过程来删除季节表并根据季节所在的年份更新它,并使用季节表中的数据更新原始表的查询。 谢谢。我在帖子中添加了一个有用的参考链接。

以上是关于SQL 使用日期范围从另一个表返回数据以放入列中的主要内容,如果未能解决你的问题,请参考以下文章

当每周按一次按钮从另一张表导入日期时,如何在列中自动填充日期?

SQL 查询日期范围保存在 2 列中

使用 Athena / Presto 从多个表返回 SQL 数据,受 1 个表中的日期范围限制

优化数据库中大表的查询(SQL)

我需要使用索引和匹配从另一列中的条件匹配的一列中提取数据

SQL 需要从列中返回范围