可以简化这个SQL吗?
可以简化这个SQL吗?还是它很好可以简化这个SQL吗?,sql,sql-server,Sql,Sql Server,可以简化这个SQL吗?还是它很好 select c.codigo, c.nome, coalesce(sum(a.vlcompra), 0) as total_client, sum(coalesce(sum(a.vlcompra), 0)) over(order by coalesce(sum(a.vlcompra), 0) desc) running_total, (select sum(vlcompra) from acumterc where tpte
select
c.codigo,
c.nome,
coalesce(sum(a.vlcompra), 0) as total_client,
sum(coalesce(sum(a.vlcompra), 0)) over(order by coalesce(sum(a.vlcompra), 0) desc) running_total,
(select sum(vlcompra) from acumterc where tpterc = 2 and tpoper = 2 and ano = 2018 ) as total,
coalesce(sum(a.vlcompra), 0) * 100 / (select sum(vlcompra) from acumterc where tpterc = 2 and
tpoper = 2 and ano = 2018 ) as perc1,
sum(coalesce(sum(a.vlcompra), 0)) over(order by coalesce(sum(a.vlcompra), 0) desc) * 100 / (select
sum(vlcompra) from acumterc where tpterc = 2 and tpoper = 2 and ano = 2018 ) as perc2
from clientes c
left join acumterc a on a.tpterc = 2
and a.tpoper = 2
and a.terceiro = c.codigo
and a.ano = 2018
group by c.codigo, c.nome
样本数据:
codigo nome vlcompra ano tpoper tpterc
-- -------- ------------ ------------- ------ ------
45 nome1 40 2018 2 2
45 nome1 60 2018 2 2
23 nome2 100 2018 2 2
23 nome2 100 2018 2 2
23 nome2 100 2018 2 2
12 nome3 500 2018 2 2
12 nome3 100 2018 2 2
12 nome3 100 2019 2 2
我得到了期望的结果:
codigo nome total_client running_total total perc1 perc2
-- -------- ------------ ------------- ------ ------ ------
45 nome1 100 100 1000 10% 10%
23 nome2 300 400 1000 30% 40%
12 nome3 600 1000 1000 60% 100%
其中:total=sumtotal\u client->perc1和perc2计算的辅助列
perc1 = porcentage of total_client over total
perc2 = porcentage of running_total over total
就个人而言,我会尝试这样做来提高绩效
DECLARE @Total MONEY
SELECT @Total=sum(vlcompra) from acumterc where tpterc = 2 and tpoper = 2 and ano = 2018
select
c.codigo,
c.nome,
coalesce(sum(a.vlcompra), 0) as total_client,
sum(coalesce(sum(a.vlcompra), 0)) over(order by coalesce(sum(a.vlcompra), 0) desc) running_total,
@Total as total,
coalesce(sum(a.vlcompra), 0) * 100 / @Total as perc1,
sum(coalesce(sum(a.vlcompra), 0)) over(order by coalesce(sum(a.vlcompra), 0) desc) * 100 / (@Total) as perc2
from clientes c
left join acumterc a
on a.tpterc = 2
and a.tpoper = 2
and a.terceiro = c.codigo
and a.ano = 2018
group by c.codigo, c.nome
您应该提供示例数据、所需结果、逻辑解释和适当的数据库标记。太好了。谢谢。