【问题标题】:SQL Server: Insert default values in table for missing monthsSQL Server:在表中插入缺失月份的默认值
【发布时间】:2021-11-20 12:53:16
【问题描述】:

我有一个表,其中包含一些具有如下列结构的产品数据:

COL1 COL2 COL3 PRODUCT COL4 COL5 FM_START FM_END FM FM_NAME FY

我还有一张表,里面有财政月和财政年的数据(最后5列),每个月都有开始日期、结束日期、编号和名称。 有些产品缺少月份,这通常意味着在这些特定月份没有对这些产品进行任何操作,但是缺少的行会扰乱我们之后对表格进行的数据分析。 我正在寻找一种算法来识别每个产品的缺失月份,从会计日历表中获取这些月份的数据,并将它们作为行插入到该表中,并为其他列提供一些默认值。

希望我的解释很清楚,有人对如何实现这一点有一些想法吗?

编辑:对于每个会计年度,会计月份的开始日期和结束日期可能略有不同。如果这条信息很重要,只是想添加。

【问题讨论】:

  • 使用日历表和LEFT JOIN
  • 从数据中发布一些示例行。
  • 日历通常每个日期都有 1 行,因此您可以为每个日期选择不同的会计期间。我担心您的源表实际上没有可用于“查找”相关会计期间信息的日期列 - 但这是基于您的列名,无法提供关于它们实际含义或包含的任何线索。
  • @SMor FM_Start 和 FM_End 都是日期列,包含每个会计月的开始和结束日期,第一列包含与产品本身相关的值,而不是日期信息。

标签: sql sql-server database algorithm


【解决方案1】:

最简单的方法是创建一组日历表,其中一个是月份:

CREATE TABLE T_MONTH_MTH
(MTH_ID          INT IDENTITY PRIMARY KEY,
 MTH_MONTH_NUM   TINYINT NOT NULL CHECK (MTH_MONTH_NUM BETWEEN 1 AND 12),
 MTH_YEAR        SMALLINT NOT NULL CHECK (MTH_YEAR BETWEEN 1 AND 9999),
 MTH_BEGIN_DATE  DATE NOT NULL, 
 MTH_END_DATE    DATE NOT NULL, 
 CHECK (YEAR(MTH_BEGIN_DATE) = MTH_YEAR AND 
        MONTH(MTH_BEGIN_DATE) = MTH_MONTH_NUM ),
 CHECK (YEAR(MTH_END_DATE) = MTH_YEAR AND 
        MONTH(MTH_END_DATE) = MTH_MONTH_NUM ))
GO

然后填充它:

INSERT INTO T_MONTH_MTH VALUES (...);

之后,您可以在此表中添加 RIGHT OUTER JOIN 以查找差距!

【讨论】:

  • 感谢您的快速回复。如果每个会计年度的每个月都有不同的开始日期和结束日期,这种方法会起作用吗?我可能应该将其包含在问题中,我将对其进行编辑以添加该部分。
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 2022-12-03
  • 2020-12-11
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2012-02-05
相关资源
最近更新 更多