2013-03-21 78 views
2

我一直在计算工资变化率上的员工年度应纳税额。存储过程计算应纳税额

salary_assigned_date | salary 
------------------------------- 
    2011-12-06   5000 
    2012-01-05   10000 
    2012-02-10   15000 
    2012-04-08   20000 
    2012-08-01   28000 

现在,在几个月的方面我应纳税所得额在2012年今年应该是这样的:

我假设没有。在一个月中的天数为30.

month | taxable_amount 
----------------------------------------------- 
    01   833.33 + 8333.33 /* Since salary has been changed 
             at 6th of month, 
             for 5 days, 
             taxable amount = 5000/30*5 
             => 833.33 
             and for remaining 25 days 
             = 10000/30*25=> 8333.33 
             and same case for remaining months.*/ 
    02   3000 + 10500 
    03   15000 
    04   4666.67 + 15333.33 
    05   20000 
    06   20000 
    07   20000 
    08   933.33 + 27066.67 
    09   28000 
    10   28000 
    11   28000 
    12   28000 

我试图编写存储过程以计算应纳税额,但是我无法完成此操作。

有人可以帮忙吗?

+0

你尝试过什么吗?请发布您的存储过程 – DevelopmentIsMyPassion 2013-03-21 14:29:28

+0

本月第一天的分配公式是什么? – Strawberry 2013-03-21 14:34:15

+0

@AshReva:最好不要在这里发布该代码,它的混乱和它不遵循英文日历。它基于尼泊尔日历。 – hsuk 2013-03-22 03:40:34

回答

1

您需要一个将表中的记录连接到具有下一个工资值的表中的记录的sql语句......您还需要使用CTE(或其他** MySQL equivalent *存在)来生成所有没有发生工资变化的月份。 * [感谢@纳威的评论]

原谅SQL服务器的语法,我不打算查找你的MySQL等价物......意图应该清楚。我知道MySQL有它自己的功能,相当于SQL服务器的日期功能getdate(),DateDiff(),DateAdd()Day()

With Dates(dt) As 
(Select min(salary_assigned_date) 
    From yourTable 
    Union All 
    Select DateAdd(month,1, dt) 
    from dates 
    where dt < getdate()) -- replace getdate() with parameter for max date to calculate 

    -- If MySQL has no equivalent to CTE, you need to generate a temp table with 
    -- these dates in it and use that instead of the [Dates] construction 

    Select t.dt, t.salary/30.0 * (day(t.dt)-1) + 
     + n.salary/30.0 * (31 - day(t.dt)) 
    From Dates d 
     join yourTable t On t.salary_assigned_date = 
        (Select Min(salary_assigned_date) 
        From test where salary_assigned_date >= d.dt) 
     join yourTable n On n.salary_assigned_date = 
        (Select Min(salary_assigned_date) 
         From test where salary_assigned_date > d.dt) 

    Select t.salary/30.0 * (day(t.salary_assigned_date)-1) + 
     + n.salary/30.0 * (31 - day(t.salary_assigned_date)) 
    From table t 
     join table n On n.salary_assigned_date = 
        (Select Min(salary_assigned_date) From table 
        Where salary_assigned_date > t.salary_assigned_date) 
+0

它实际上比这更复杂。你还必须在几个月内增加薪资记录(这一年的薪水记录比一年中的月份少)。 – 2013-03-21 14:51:24

+0

http://stackoverflow.com/questions/1382573/how-do-you-use-the-with-clause-in-mysql – 2013-03-21 15:24:12