Remover duplicados de um atendimento

06/09/2023

0

Boa tarde pessoal,
Estou fazendo uma consulta no SQL Server que me mostre os atendimentos que tiveram produtos vendidos relacionado a alguma promoção. Porém, na consulta preciso remover produtos (COD_SKU) relacionados a promoções diferentes (DESC_PROMOCAO) que fazem parte do mesmo atendimento (NUMERO_ATENDIMENTO). No exemplo abaixo, mesmo usando o distinct ainda me trouxe esses dados repetidos.

COD_LOJA NUMERO_ATENDIMENTO NOME_VENDEDOR DESC_PROMOCAO COD_SKU DESC_SKU
F032 1648 VALDIRENE SEVERO RODRIGUES COLEÇÕES_ANTIGAS_XT_40%OFF 143564-1041 MOCHILA LIFESTYLE VERMONT PT
F032 1648 VALDIRENE SEVERO RODRIGUES COLEÇÕES_ANTIGAS_XT_40%OFF KJ4*09005 BOLSA DE OMBRO MEDIA BE-HER PRETO
F032 1648 VALDIRENE SEVERO RODRIGUES LHB_FW23_40%OFF_V3 143564-1041 MOCHILA LIFESTYLE VERMONT PT
F032 1648 VALDIRENE SEVERO RODRIGUES LHB_FW23_40%OFF_V3 KJ4*09005 BOLSA DE OMBRO MEDIA BE-HER PRETO

select distinct

COD_LOJA,

DESC_LOJA,

LX_DESCONTO,

NUMERO_ATENDIMENTO,

DATA_ATENDIMENTO,

COD_VENDEDOR,

NOME_VENDEDOR,

MOTIVO_DESCONTO,

LX_ORIGEM_DESCONTO_NAME,

case

when lx_origem_desconto_name = 'MANUAL' THEN 'MANUAL'

ELSE

e.DESC_PROMOCAO

end AS DESC_PROMOCAO,

c.COD_SKU,

c.DESC_SKU,

REPLACE( cast((b.preco_bruto_item * b.qtde_item ) as decimal(8,2)), '.', ',')as 'PREÇO_BRUTO',

REPLACE( cast((b.qtde_item) as decimal(6,0)), '.', ',') as 'QTDE_ITEM',

REPLACE( CAST(a.valor_desconto AS decimal(6,2)), '.', ',') as 'VALOR_DESCONTO',

REPLACE( b.VALOR_LIQUIDO_PAGO, '.', ',') 'VALOR_LIQUIDO_PAGO_ITEM',

REPLACE( cast(1- valor_liquido_pago/(b.preco_bruto_item*b.qtde_item) as decimal(8,2)), '.', ',') as '%_DESCONTO_NO_ITEM'


from [LX_LJV].[VW_DESCONTO_ATENDIMENTO_ITEM_VENDEDOR] a

inner join lx_ljv.ljv_atendimento_item b

on a.id_atendimento_item = b.id_atendimento_item

inner join lx_prd.prd_sku_produto c

on b.id_sku = c.id_sku

LEFT join lx_ljv.ljv_atendimento_acao_promocao d

on a.id_atendimento = d.id_atendimento

LEFT join lx_prm.prm_promocao e

on e.id_promocao = d.id_promocao

where data_atendimento between '20230801' and '20230831'
AND COD_LOJA='F032'

order by DATA_ATENDIMENTO

Alguém pode ajudar com outra solução?
Otávio Junior

Otávio Junior

Responder

Post mais votado

06/09/2023

As linhas estão repetindo a DESC_PROMOCAO por conta das colunas COD_SKU e DESC_SKU, que são distintas de uma linha para a outra.

Pelo que deu a entender, dentro de um atendimento, cada produto deve aparecer uma única vez e a repetição está ocorrendo porque foi associada mais de uma promoção ao atendimento, na tabela ljv_atendimento_acao_promocao.

Solução 1: Impedir que um atendimento participe de mais de uma promoção

Você pode eliminar as promoções duplicadas da tabela ljv_atendimento_acao_promocao, para que cada atendimento possua apenas uma promoção e, para garantir que isto não ocorra novamente, pode criar uma unique key, impedindo que mais de uma promoção seja inserida em um mesmo pedido.

alter table ljv_atendimento_acao_promocao
add constraint ljv_atendimento_acao_promocao_uk01
unique (id_atendimento, id_promocao)

Solução 2: Caso mais de uma promoção seja associada a um atendimento, selecionar apenas um deles

Neste caso, que é bem mais complexo de resolver, você precisa criar uma regra de precedência, indicando que promoção deve prevalecer quando aplicada simultaneamente com outras promoções. A query ficaria significativamente mais complexa e você teria que tratar isso em todas as etapas do processo, para não haver divergências entre um processo e outro.

Eu ficaria com a solução 1.

Arthur Heinrich

Arthur Heinrich
Responder

Mais Posts

06/09/2023

Otávio Junior

As linhas estão repetindo a DESC_PROMOCAO por conta das colunas COD_SKU e DESC_SKU, que são distintas de uma linha para a outra.

Pelo que deu a entender, dentro de um atendimento, cada produto deve aparecer uma única vez e a repetição está ocorrendo porque foi associada mais de uma promoção ao atendimento, na tabela ljv_atendimento_acao_promocao.

Solução 1: Impedir que um atendimento participe de mais de uma promoção

Você pode eliminar as promoções duplicadas da tabela ljv_atendimento_acao_promocao, para que cada atendimento possua apenas uma promoção e, para garantir que isto não ocorra novamente, pode criar uma unique key, impedindo que mais de uma promoção seja inserida em um mesmo pedido.

alter table ljv_atendimento_acao_promocao
add constraint ljv_atendimento_acao_promocao_uk01
unique (id_atendimento, id_promocao)

Solução 2: Caso mais de uma promoção seja associada a um atendimento, selecionar apenas um deles

Neste caso, que é bem mais complexo de resolver, você precisa criar uma regra de precedência, indicando que promoção deve prevalecer quando aplicada simultaneamente com outras promoções. A query ficaria significativamente mais complexa e você teria que tratar isso em todas as etapas do processo, para não haver divergências entre um processo e outro.

Eu ficaria com a solução 1.



>>>>>>>>
Obrigado pela ajuda Arthur. Também pensei em adicionar a chave estrangeira id_promocao na tabela lx_ljv.ljv_atendimento_item, dessa forma conseguiria saber qual promoção foi aplicada pra cada COD_SKU.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar