SQL: table 循环期间金额不递增
SQL: Amount is not incremented during table looping
我必须根据一个 table 中存在的总工资和另一个 table 中存在的不同其他参数来计算税后工资金额。是这样的情况:
我有一份薪水table,其中包含员工的总薪水
要计算净额,我必须减去或添加其他参数(供款、保险等),具体取决于相应的价值是总值还是相对值(百分比)。这是 table:
逻辑:
Relativite = 1 表示该值(table 中的值)是百分比,0 表示它是总值。
Sens = 1 表示必须从工资中减去该值,0 表示必须添加它。
在这个例子中,为了获得净工资,我想要实现的是这样的:
第一行:Net_Salary = (700 - (700*13.4)/100).
第二行:Net Salary = value of first Line - 13
第三行:Net Salary = value of 2nd Line - 13000
等等...
为了实现这一点,我使用了一个游标来遍历 table 并获取每个值来计算净工资。我最终得到这样的结果:
此结果的问题是在循环 table 时金额没有减少。它始终根据原始值进行计算。
这是我用过的代码:
declare @registration_nr varchar(20),
@entity_id varchar(10)
DECLARE @gross_salary float, @net_salary float, @cursid int, @category varchar(50), @value float, @relative numeric(1), @sens numeric(1)
set @registration_nr = '19820506-0-2';
set @entity_id = 'edu7';
SET @gross_salary = (select pay_amount from dbo.EMPLOYEES_PAY where registration_nr = @registration_nr and entity_id = @entity_id and active = 1)
--set @rowcnt = (select count(1) from dbo.PARAMETRES_SALAIRES where code_institution = @entity_id and actif = 1)
CREATE TABLE #temp
(registration_nr varchar(20),
category varchar(50),
valeur float,
relativite numeric(1),
sens numeric(1),
salaire_net float);
DECLARE curs_rowid CURSOR FAST_FORWARD FOR
SELECT nom_categorie,
relativite,
valeur,
sens
FROM dbo.SALARY_SETTINGS --This is the table that contains the parameters (insurance,...)
WHERE code_institution = @entity_id and actif = 1;
OPEN curs_rowid
FETCH NEXT FROM curs_rowid INTO @category, @relative, @value, @sens
WHILE @@fetch_status = 0
BEGIN
if @relative = 0
BEGIN
if @sens = 0
BEGIN
set @net_salary = @gross_salary + (@gross_salary*@value)/100
INSERT INTO #temp (category, valeur, relativite, sens, salaire_net)
values(@category, @value, @relative, @sens, @net_salary);
END;
else if @sens = 1
BEGIN
set @net_salary = @gross_salary - (@gross_salary*@value)/100
INSERT INTO #temp (category, valeur, relativite, sens, salaire_net)
values(@category, @value, @relative, @sens, @net_salary);
END;
END;
else if @relative = 1
BEGIN
if @sens = 0
BEGIN
set @net_salary = @gross_salary + @value
INSERT INTO #temp (category, valeur, relativite, sens, salaire_net)
values(@category, @value, @relative, @sens, @net_salary);
END;
else if @sens = 1
BEGIN
set @net_salary = @gross_salary - @value
INSERT INTO #temp (category, valeur, relativite, sens, salaire_net)
values(@category, @value, @relative, @sens, @net_salary);
END;
END;
FETCH NEXT FROM curs_rowid INTO @category, @relative, @value, @sens
END;
CLOSE curs_rowid;
DEALLOCATE curs_rowid;
知道如何解决这个问题并在最后一行显示基于所有先前计算的最后一个值吗?
行后:
SET @gross_salary = (select pay_amount from dbo.EMPLOYEES_PAY where registration_nr = @registration_nr and entity_id = @entity_id and active = 1)
添加
SET @net_salary=@gross_salary;
并且在光标部分,将所有@gross_salary替换为@net_salary
我必须根据一个 table 中存在的总工资和另一个 table 中存在的不同其他参数来计算税后工资金额。是这样的情况:
我有一份薪水table,其中包含员工的总薪水
要计算净额,我必须减去或添加其他参数(供款、保险等),具体取决于相应的价值是总值还是相对值(百分比)。这是 table:
逻辑:
Relativite = 1 表示该值(table 中的值)是百分比,0 表示它是总值。 Sens = 1 表示必须从工资中减去该值,0 表示必须添加它。
在这个例子中,为了获得净工资,我想要实现的是这样的:
第一行:Net_Salary = (700 - (700*13.4)/100).
第二行:Net Salary = value of first Line - 13
第三行:Net Salary = value of 2nd Line - 13000
等等...
为了实现这一点,我使用了一个游标来遍历 table 并获取每个值来计算净工资。我最终得到这样的结果:
此结果的问题是在循环 table 时金额没有减少。它始终根据原始值进行计算。
这是我用过的代码:
declare @registration_nr varchar(20),
@entity_id varchar(10)
DECLARE @gross_salary float, @net_salary float, @cursid int, @category varchar(50), @value float, @relative numeric(1), @sens numeric(1)
set @registration_nr = '19820506-0-2';
set @entity_id = 'edu7';
SET @gross_salary = (select pay_amount from dbo.EMPLOYEES_PAY where registration_nr = @registration_nr and entity_id = @entity_id and active = 1)
--set @rowcnt = (select count(1) from dbo.PARAMETRES_SALAIRES where code_institution = @entity_id and actif = 1)
CREATE TABLE #temp
(registration_nr varchar(20),
category varchar(50),
valeur float,
relativite numeric(1),
sens numeric(1),
salaire_net float);
DECLARE curs_rowid CURSOR FAST_FORWARD FOR
SELECT nom_categorie,
relativite,
valeur,
sens
FROM dbo.SALARY_SETTINGS --This is the table that contains the parameters (insurance,...)
WHERE code_institution = @entity_id and actif = 1;
OPEN curs_rowid
FETCH NEXT FROM curs_rowid INTO @category, @relative, @value, @sens
WHILE @@fetch_status = 0
BEGIN
if @relative = 0
BEGIN
if @sens = 0
BEGIN
set @net_salary = @gross_salary + (@gross_salary*@value)/100
INSERT INTO #temp (category, valeur, relativite, sens, salaire_net)
values(@category, @value, @relative, @sens, @net_salary);
END;
else if @sens = 1
BEGIN
set @net_salary = @gross_salary - (@gross_salary*@value)/100
INSERT INTO #temp (category, valeur, relativite, sens, salaire_net)
values(@category, @value, @relative, @sens, @net_salary);
END;
END;
else if @relative = 1
BEGIN
if @sens = 0
BEGIN
set @net_salary = @gross_salary + @value
INSERT INTO #temp (category, valeur, relativite, sens, salaire_net)
values(@category, @value, @relative, @sens, @net_salary);
END;
else if @sens = 1
BEGIN
set @net_salary = @gross_salary - @value
INSERT INTO #temp (category, valeur, relativite, sens, salaire_net)
values(@category, @value, @relative, @sens, @net_salary);
END;
END;
FETCH NEXT FROM curs_rowid INTO @category, @relative, @value, @sens
END;
CLOSE curs_rowid;
DEALLOCATE curs_rowid;
知道如何解决这个问题并在最后一行显示基于所有先前计算的最后一个值吗?
行后:
SET @gross_salary = (select pay_amount from dbo.EMPLOYEES_PAY where registration_nr = @registration_nr and entity_id = @entity_id and active = 1)
添加
SET @net_salary=@gross_salary;
并且在光标部分,将所有@gross_salary替换为@net_salary