Вы можете ссылаться на сумму SalaryValue
для каждого empid
в каждой строке, используя оконные агрегаты (пара isnull nullif
предназначена для обработки деления на ноль ошибок):
declare @t table(empid int,SalaryValue float,istotal smallint);
insert into @t values(1, 10.0, 0), (1, 20.0, 0), (1, 30.0, 0), (1, 60.0, 1);
select empid
,SalaryValue
,istotal
,isnull(SalaryValue / nullif(sum(case when istotal = 1 then SalaryValue else 0 end) over (partition by empid),0),0) as Percentage
from @t;
Вывод:
+-------+-------------+---------+-------------------+
| empid | SalaryValue | istotal | Percentage |
+-------+-------------+---------+-------------------+
| 1 | 10 | 0 | 0.166666666666667 |
| 1 | 20 | 0 | 0.333333333333333 |
| 1 | 30 | 0 | 0.5 |
| 1 | 60 | 1 | 1 |
+-------+-------------+---------+-------------------+
В качестве альтернативы, вы можете присоединить таблицу к себе с одной версией, возвращающей istotal = 1
, а другой istotal = 0
:
declare @t table(empid int,SalaryValue float,istotal smallint);
insert into @t values(1, 10.0, 0), (1, 20.0, 0), (1, 30.0, 0), (1, 60.0, 1);
with t as
(
select empid
,SalaryValue
from @t
where istotal = 1
)
select s.empid
,s.SalaryValue
,t.SalaryValue as Total
,isnull(s.SalaryValue / nullif(t.SalaryValue,0),0) as Percentage
from @t as s
left join t
on s.empid = t.empid
where s.istotal = 0;
Выход:
+-------+-------------+-------+-------------------+
| empid | SalaryValue | Total | Percentage |
+-------+-------------+-------+-------------------+
| 1 | 10 | 60 | 0.166666666666667 |
| 1 | 20 | 60 | 0.333333333333333 |
| 1 | 30 | 60 | 0.5 |
+-------+-------------+-------+-------------------+