计算分隔的月份(oracle 11G)


尊敬的专家

我们有一个具有列TOTAL_MONTHS的表,例如如果

如下表所示,需要使用更新语句进行更新。

TOTAL_ MONTHS=15;月份<12〃=12和更新名为"0"的列;月份>12〃=3

下表中的另一个例子是TOTAL_ MONTHS=8;月份<12〃=8和名为"8"的更新列;月份>12〃=0

金额14<11>
标题Total_months月数<12个月;12
101012882800015123
101012894000013121
11010129020000001010
110101291500012
1101012396000110
1101012405000880
1012100369012120

使用LEASTGREATEST:

update test3
set "Months<=12" = LEAST(total_months, 12),
"Months>12" = GREATEST(total_months - 12, 0);

当然,CASE表达式也可以做到这一点。

演示:https://dbfiddle.uk/wB89f9eN

顺便说一句,我认为将这些计算值存储在公共表列中不是一个好主意。不要在数据库中冗余存储数据。如果有一天你发现一行包含total_months=15,这意味着什么;月份<12〃=12;月份>12〃=10?哪个值正确,哪个不正确?如果为了方便起见,您希望看到类似于表列的结果,请使用生成的列或视图。

如果您想将月份计算为全年和部分年,或者最多计算一年和一年以上,那么您可以计算这些值,并且不需要在数据库中有单独的列,因为这些列会有不同步的风险。

如果您确实想表示表中的值,那么您可以使用虚拟列:

CREATE TABLE "TEST3"(
TITLE            VARCHAR2(100 BYTE),
AMOUNT           NUMBER,     
Total_Months     NUMBER,     
Full_Year_Months NUMBER
GENERATED ALWAYS AS (Total_months - MOD(total_months, 12)),
Part_Year_Months NUMBER
GENERATED ALWAYS AS (MOD(total_months, 12)),
"Month>12"       NUMBER
GENERATED ALWAYS AS (GREATEST(total_months-12,0)),
"Month<=12"      NUMBER
GENERATED ALWAYS AS (LEAST(total_months,12))
);

对于样本数据:

Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101288',  28000,15);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101289',  40000,13);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101290',2000000,10);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101291',  50000,14);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101239',   6000,11);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101240',  50000, 8);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10121003',    690,12);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('12345678',1234567,45);

然后该表包含:

金额;12月<12110101288280001522<12>1101012894000013110101290200000011010129150000142>1101012396000110101240500001012100369012>01212346781345

相关内容

  • 没有找到相关文章