【问题标题】:Math Formula Into Oracle Function将数学公式转换为 Oracle 函数
【发布时间】:2018-09-29 00:31:21
【问题描述】:

我有这个数学公式,我试图将其转换为 Oracle 函数。 这就是它的工作方式,taxableIncome 循环遍历表格,它选择表格的第一行,如果大于 CumulativeAmount,则减去 CumulativeAmount 来自 taxableIncome 并保留 余数,它将 CumulativeAmountPercentage 相乘得到一个值(x ),取余数并转到表中的下一行,并从余数中减去 CumulativeAmount。当余数小于 CumulativeAmount 时,它将应用 17.5余数。稍后我将对 (x) 值求和以获得总值。数值计算不正确。

CREATE OR REPLACE function CalculateIncomeTax(periodId NVARCHAR2, 
employeeId NVARCHAR2,paygroupcode PAYROLL_MASTER.PAY_PAY_GROUP_CODE%type,
taxableIncome NUMBER)
return NUMBER 
AS
IncomeTax NUMBER (10,2); 
BEGIN
SELECT 
 coalesce(SUM(                       
  CASE WHEN (taxableIncome > T.TAX_CUMMULATIVE_AMOUNT) THEN (taxableIncome - 
  T.TAX_CUMMULATIVE_AMOUNT)* (T.TAX_PERCENTAGE/ 100)                            
  ELSE 0.00 END
    ) ,0)                       
  INTO IncomeTax    
  FROM TAX_LAW T  JOIN PAY_GROUP P ON P.PAY_FORMULA_ID   =T.TAX_FORMULA_ID                         
  WHERE P.PAY_CODE  = paygroupcode;
return IncomeTax;  
end;
 /

例如:

taxableIncome= 1000,the function must loop on the first line on the 
table CummulativeAmount=261,so 1000-261=739, and 0*739=0,0 is 
value(x), 
next loop 739>70,739 is the remainder,so 739-70=669, and (5/100)*70 
=3.5,3.5 is value(x),   
next loop 669>100,669-100=569, (10/100)*100=10,10 is value(x),
now 569 < 2810, so (17.5/100)*569=99.575,99.575 is value(x).
so we sum all x  =0+3.5+10+99.575= 113.075

如果 taxableIncome = 300,300 大于表中的 261 所以我们将使用 0 的百分比,但我们会得到 0.now (300-261) 小于 70 所以不能使用 5 的百分比所以所得税是 0。但是 17.5 将应用于 (300-261) 得到 6.825,总所得税是 6.825。这是计算背后的逻辑。我想在计算时使用 while 语句。

【问题讨论】:

  • “数值计算不正确” - 解释一下。你期望什么值,基于什么输入,你得到什么返回值,为什么这是错误的?请编辑您的问题并提供示例输入作为文本,而不是作为图像,以及计算应该是什么的完整演练。谢谢。
  • 您使用的是哪个版本的 Oracle?
  • @BobJarvis,你甚至没有仔细阅读这个问题,我解释了数学公式必须如何工作。如果我知道为什么我的函数是错误的,我不会来这里问。你无济于事。
  • @APC,我使用的是 Oracle 版本 12c
  • 这个问题还有一些不清楚的地方。如果taxableIncome = 300,比如说?如果taxableIncome = 10000 怎么办?您的函数中提到的PAY_GROUP 表的目的是什么?另外,请注意您的工作示例计算有两个错误:669-100569,不是5590+33.45+55.9+97.825187.175,不是232.725

标签: oracle function plsql


【解决方案1】:
CREATE OR REPLACE function CalculateIncomeTax2(taxableIncome NUMBER)
return NUMBER 
AS
IncomeTax NUMBER (10,2) := 0;
TaxableRemainder NUMBER := taxableIncome;
BEGIN
for r in (select tax_id, tax_percentage, tax_cummulative_amount
          from incometax
          order by tax_id)
loop
    if TaxableRemainder > r.tax_cummulative_amount then
        TaxableRemainder := TaxableRemainder - r.tax_cummulative_amount;
        incometax := incometax + (r.tax_cummulative_amount * r.tax_percentage / 100);
    else
        incometax := incometax + (TaxableRemainder * r.tax_percentage / 100);
        exit; 
    end if;
end loop;

return IncomeTax;
end; 
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多