Remover duplicados de um atendimento
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?
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
Curtidas 0
Melhor post
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.
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
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.
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