1
resposta

[Projeto] Resolução com select e join + solução com vários select

Fico confuso em qual consulta oferece melhor desempenho nessas soluções.

Solução 1

select tc.NOME,
    tc.CPF, 
    CONVERT(VARCHAR(7), NF.DATA_VENDA, 120) as RefVenda,
    sum(inf.QUANTIDADE) as QtdVendida,
    tc.VOLUME_DE_COMPRA as VlCompraMax,
case 
    when sum(inf.QUANTIDADE) > tc.VOLUME_DE_COMPRA then 'Ultrapassou o limite'
    when sum(inf.QUANTIDADE) < tc.VOLUME_DE_COMPRA then 'Dentro do limite'
end as SituacaoLimite
from ITENS_NOTAS_FISCAIS inf
join NOTAS_FISCAIS nf on inf.NUMERO = nf.NUMERO
join TABELA_DE_CLIENTES tc on nf.CPF = tc.CPF
group by CONVERT(VARCHAR(7), NF.DATA_VENDA, 120), tc.NOME, tc.CPF, tc.VOLUME_DE_COMPRA
order by tc.NOME, CONVERT(VARCHAR(7), NF.DATA_VENDA, 120)

Solução 2 (Fiz de baixo pra cima)

select nome, cpf, ref, sum(Vl_Por_NF) as VlMes, MaximoVlMes, 
case when (sum(Vl_Por_NF) > MaximoVlMes) Then 'Ultrapassou Limite'
    when (sum(Vl_Por_NF) < MaximoVlMes) Then 'Dentro do Limite'
    end as Resultado
from 
(SELECT NF.NUMERO, NF.CPF, vlc.nome, CONVERT(VARCHAR(7), NF.DATA_VENDA, 120) AS REF, Nf_Volume.Vl_Por_NF, vlc.VOLUME_DE_COMPRA as MaximoVlMes
FROM NOTAS_FISCAIS NF
JOIN (
select NUMERO as NRO_NF, sum(QUANTIDADE) as Vl_Por_NF from ITENS_NOTAS_FISCAIS group by NUMERO) Nf_Volume 
ON NF.NUMERO = Nf_Volume.NRO_NF
JOIN (
select cpf, nome, VOLUME_DE_COMPRA from TABELA_DE_CLIENTES) vlc 
on vlc.CPF = nf.CPF) planilhao
group by nome, cpf, ref, MaximoVlMes
order by nome, cpf, ref
1 resposta

Oii Diego, como você está?

Desculpe por demorar a te responder.

Ambas as soluções são válidas e podem funcionar bem dependendo do contexto em que são aplicadas. Porém, a primeira solução parece ser mais eficiente em termos de desempenho, pois utiliza apenas um SELECT com JOINs e GROUP BY, enquanto a segunda solução utiliza vários SELECTs aninhados.

Além disso, a primeira solução utiliza a função SUM para calcular a quantidade vendida, o que é mais eficiente do que a segunda solução que utiliza uma subconsulta com GROUP BY para obter a mesma informação.

Espero ter ajudado. Abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!