ПРИМЕР, КОГДА НАЧАТЬ НАЛОГ НА Налоговую систему на основе уровня - PullRequest
0 голосов
/ 31 января 2019

У меня есть таблица с доходами пользователей, и я хочу рассчитать процент налога на прибыль на основе этого дохода.Дело в том, что налоговая ставка различна для каждой категории, например:

MinLimit| MaxLimit| TaxRate
0       | 14000   | 10.50
14001   | 48000   | 17.50
48001   | 70000   | 30.00
70001   | 1000000 | 33.00

Таким образом, если доход 1 человека составляет 49 000, тогда они будут облагаться налогом следующим образом:

14000 * 0.1050 = 1470
34000 * 0.1750 = 5950 (34,000 is income between 14k -48k)
1000  * 0.30   = 300  (1000 is remaining income)
total = 1470 + 5950 + 300 = 7720

Iя работаю на SQL Server 2017 Express.Я попытался выполнить цепочечный оператор CASE-WHEN, т.е.

CASE WHEN
     THEN

     WHEN
     THEN 
and so on...

, но я могу выяснить, как добавить логику вычитания оставшейся суммы.Пожалуйста, найдите мой код ниже.

SELECT 'emp_name' AS 'Director', 
SUM(ABS([Transaction Amount])) AS 'INCOME',
CASE WHEN (SUM(ABS([Transaction Amount])) < 14000)
     THEN ((SUM(ABS([Transaction Amount])) - 14000) * 0.1050)

     WHEN (SUM(ABS([Transaction Amount])) > 14000 and (SUM(ABS([Transaction Amount])) < 48001))
     THEN (((SUM(ABS([Transaction Amount])) - 14000) * 0.1050) - 48000) * 0.1750 end AS 'Income Tax'
FROM Transactions

РЕДАКТИРОВАТЬ 1: Входные данные:

Transaction Type| PAYEE  | Transaction Amount
DEBIT           | DEBIT  | -184.00
CREDIT          | CREDIT | 4000.00
...

Выходные данные:

Director | INCOME  | Income Tax
emp_name | 45100.00| NULL

Пожалуйста, дайте мне знать, где я иду не так, или если мое мышлениеневерен.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Я думаю, что этот релевантный запрос с использованием группировки по таблице транзакций и присоединению к таблице ставок налога может быть ниже исключенного результата:

CREATE TABLE #Transaction  
(
    tID             int PRIMARY KEY,  
    tIdUser         varchar(50),
    Amount          decimal(9,3)
 );  
CREATE TABLE #RefTaxe  
(
    pID             int PRIMARY KEY, 
    minLimit        int, 
    maxLImit        int,
    rate            decimal(9,3)
); 




INSERT INTO #Transaction 
SELECT 1, 'User1', 1259.3
UNION
SELECT 2, 'User1', 10259.3
UNION
SELECT 3, 'User3', 30581.3
UNION 
SELECT 4, 'User2', 75000.36
UNION 
SELECT 5, 'User2', 15000.36
UNION 
SELECT 6, 'User4', 45000.36
UNION 
SELECT 7, 'User4', 5000.36


INSERT INTO #RefTaxe 
select 1,0,14000,10.50
UNION
SELECT 2,14001,48000,17.50
UNION
SELECT 3,48001,70000,30.00
UNION
SELECT 4,70001,1000000,33.00


-- SELECT * FROM #Transaction

-- SELECT * FROM #RefTaxe

--  SELECT tIdUser,SUM(AMOUNT) as SumAmount, CAST(FLOOR(SUM(AMOUNT))as int) as SumAsInt     FROM #Transaction GROUP BY tIdUser
/***/
-- Perform select 
/***/
SELECT tIdUser, SumAmount as 'DetaxedAmount' ,SumAmount * (rate/100) as TaxOfAmount, SumAmount+ SumAmount * (rate/100) as TaxedAmount
FROM #RefTaxe RT    
JOIN (
    SELECT tIdUser,SUM(AMOUNT) as SumAmount,  CAST(FLOOR(SUM(AMOUNT))as int) as SumAsInt
    FROM #Transaction GROUP BY tIdUser
)   AS GroupedTR ON RT.minLimit <= SumAsInt AND RT.maxLImit >= SumAsInt


/***/

DROP TABLE #Transaction
DROP TABLE #RefTaxe

Вывод результата:

tIdUser DetaxedAmount   TaxOfAmount     TaxedAmount
User1   11518.600     1209.453000      12728.053
User2   90000.720     29700.237600     119700.958
User3   30581.300     5351.727500      35933.028
User4   50000.720     15000.216000     65000.936
0 голосов
/ 31 января 2019

Я предлагаю вам начать с MinLimit, равного 1, а не 0. Остальные вычисления просты:

declare @taxslabs table (minlimit int, maxlimit int, taxrate decimal(18, 2));
insert into @taxslabs values
(1,     14000,   10.50),
(14001, 48000,   17.50),
(48001, 70000,   30.00),
(70001, 1000000, 33.00);

select persons.*, taxslabs.*, taxableamount, taxableamount * taxrate / 100 as taxamount
from (values
    (1, 49000),
    (2, 70000),
    (3, 70001)
) as persons(id, income)
cross join @taxslabs as taxslabs
cross apply (select case when income <= maxlimit then income else maxlimit end - minlimit + 1) as ca(taxableamount)
where minlimit <= income

Вы можете поместить этот запрос в подзапрос и использовать GROUP BY ... SUM() или SUM() OVER (PARTITION BY) для расчета суммы налогов.

Пример вывода:

| id | income | minlimit | maxlimit | taxrate | taxableamount | taxamount        |
|----|--------|----------|----------|---------|---------------|------------------|
| 1  | 49000  | 1        | 14000    | 10.50   | 14000         | 1470.000000      |
| 1  | 49000  | 14001    | 48000    | 17.50   | 34000         | 5950.000000      |
| 1  | 49000  | 48001    | 70000    | 30.00   | 1000          | 300.000000       |
| 2  | 70000  | 1        | 14000    | 10.50   | 14000         | 1470.000000      |
| 2  | 70000  | 14001    | 48000    | 17.50   | 34000         | 5950.000000      |
| 2  | 70000  | 48001    | 70000    | 30.00   | 22000         | 6600.000000      |
| 3  | 70001  | 1        | 14000    | 10.50   | 14000         | 1470.000000      |
| 3  | 70001  | 14001    | 48000    | 17.50   | 34000         | 5950.000000      |
| 3  | 70001  | 48001    | 70000    | 30.00   | 22000         | 6600.000000      |
| 3  | 70001  | 70001    | 1000000  | 33.00   | 1             | 0.330000         |
0 голосов
/ 31 января 2019

Коррелированный подзапрос может быть самым простым для чтения и понимания:

declare @t table (MinLimitExclusive int, MaxLimitInclusive int, TaxRate decimal(5,2))
insert into @t(MinLimitExclusive,MaxLimitInclusive,TaxRate) values
(0    ,14000  , 10.50),
(14000,48000  , 17.50),
(48000,70000  , 30.00),
(70000,1000000, 33.00)

declare @transactions table (Income decimal(10,2))
insert into @transactions (Income) values (49000)

select
    (Income - MinLimitExclusive) * TaxRate / 100 +
    (select SUM((rates2.MaxLimitInclusive - rates2.MinLimitExclusive) * rates2.TaxRate / 100) 
    from @t rates2 where rates2.MaxLimitInclusive <= rates.MinLimitExclusive)

from
    @transactions tr
        inner join
    @t rates
        on
            tr.Income > rates.MinLimitExclusive and tr.Income <= rates.MaxLimitInclusive

Это значительно упрощается, когда вы понимаете, что единственная математика, которую вам нужно сделать, относящаяся к фактическому доходу, связана с скобкой, которую он на самом делевписывается - все нижние скобки ставок, косвенно, были использованы полностью, так что вы можете рассчитать эти другие налоги исключительно из таблицы ставок.

Я немного изменил данные ваших ставок, чтобы сделать вычисления простымии не нужно много +/-1 настроек.

...