Remover duplicados de um atendimento

SQL Server

06/09/2023

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

Curtidas 0

Melhor post

Arthur Heinrich

Arthur Heinrich

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.
GOSTEI 1

Mais Respostas

Otávio Junior

Otávio Junior

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.



>>>>>>>>
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.
GOSTEI 0
POSTAR