我必须在 Oracle 中创建一个类似的表,如下所示。正如您所看到的,月份和年份被合并,然后根据描述类型存储每月服务器计数数据。为了获取数据,我使用 Oracle。月份和年份栏目仍在继续。还需要为每个月安排此作业,以便 MonthYear 列自动添加到表中,并且定期存储该值。欢迎任何建议。
在 SQL(不仅仅是 Oracle)中,表具有固定数量的列。当您考虑每月添加一个新列的解决方案时,您正在尝试以非 SQL 方式执行某些操作。
每个月没有列。转置表格,使
month
成为单列,当您想要添加新月份的数据时,您可以插入新行。这比添加更多列简单得多。
类似:
CREATE TABLE table_name (
month DATE
CONSTRAINT table_name__month__pk PRIMARY KEY
CONSTRAINT table_name__month__chk CHECK (month = TRUNC(month, 'MM')),
server_count_start NUMBER(10,0) NOT NULL,
new_servers NUMBER(10,0) DEFAULT 0 NOT NULL,
m_and_a_addition NUMBER(10,0) DEFAULT 0 NOT NULL,
moved_to_cloud NUMBER(10,0) DEFAULT 0 NOT NULL,
decomissioned NUMBER(10,0) DEFAULT 0 NOT NULL
);
注意:不要存储月末总计,因为您可以使用
server_start_count + new_servers _ m_and_a_addition - moved_to_cloud - decomissioned
进行计算。如果您使用的是 Oracle 12,那么您可以添加一列并使用 GENERATED ALWAYS AS (server_start_count + new_servers _ m_and_a_addition - moved_to_cloud - decomissioned)
,但您使用的是非常旧的 Oracle 版本,并且不受支持(请升级)。
如果您想使用月份作为列来显示输出,那么您可以在SQL中或在您用来访问数据的任何第三方应用程序中
PIVOT
表。但为了存储数据,请添加行,而不是列。