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 年の課税対象額を月単位で表すと、次のようになります。

いいえと仮定しました。1 か月の日数を 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

課税対象額を計算するためにストアド プロシージャを作成しようとしましたが、これを達成できませんでした。

誰かがこれについて助けることができますか?

4

1 に答える 1

1

テーブル内のレコードを、次の給与値を持つテーブル内のレコードに結合する sql ステートメントが必要です...また、CTE (または ** MySQL に相当するもの* が存在するもの) を使用して、すべての月を生成する必要があります。給与の変動はありません。* [@Neville のコメントに感謝]

SQL サーバーの構文については申し訳ありませんが、MySQL に相当するものを調べるつもりはありません...意図は明らかです。getdate()MySQL には、SQL サーバーの日付関数、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)
于 2013-03-21T14:30:06.940 に答える