SQL Server находит процент, используя уже рассчитанную сумму - PullRequest
0 голосов
/ 29 мая 2018

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

Флаг istotal показывает, является ли он общим или нет;0 означает не итог, а 1 означает итог

create table work.temp
(
    empid int, 
    Salaryvalue float,
    istotal smallint
)

insert into work.temp 
values (1, 10.0, 0), (1, 20.0, 0), (1, 30.0, 0), (1, 60.0, 1)

Это ожидаемый результат:

create table work.output
(
    empid int, 
    salaryvalue float,
    issubtotal smallint,
    percentage float
)

insert into work.output 
values (1, 10.0, 16.6),  --(10.0/60.0)*100
       (1, 20.0, 33.3),  --(20.0/60.0)*100
       (1, 30.0, 50.0),  --(30.0/60.0)*100
       (1, 60.0, 100.0)  --(60.0/60.0)*100

Не совсем уверен, как это сделать

Спасибо, г-н

1 Ответ

0 голосов
/ 29 мая 2018

Вы можете ссылаться на сумму 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 |
+-------+-------------+-------+-------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...