Usuário com melhor resposta
Inserir linhas faltantes na base

Pergunta
-
Bom dia pessoal!
Estou com o seguinte problema :
Tenho um base com os seguintes campos: Data,cod_cliente,cod_prod,total_venda,pertence_cesta
Tenha seguinte amostra:
2017-01-01;1;1;5;1
2017-01-02;1;1;7;1
2017-01-04;1;1;8;1
2017-01-05;1;1;12;1
Segundo a amostra acima, o dia 2017-01-03 está faltando, então preciso inserir este registro na base deixando o campo total_venda zerado.
O resultado final deve ser este
2017-01-01;1;1;5;1
2017-01-02;1;1;7;1
2017-01-03;1;1;0;1
2017-01-04;1;1;8;1
2017-01-05;1;1;12;1
Tenho a tabela calendario que tem todos os dias do ano
Tentei executar a query abaixo para inserir as linhas faltantes em uma tabela à parte, mas nao muito certo.
insert into tabela_auxiliar
select distinct
n.cod_cliente,
r.data,
n.cod_prod,
pertence_cesta
coalesce(total_venda,0) as total_venda,
from tabela as n, calendario as r
where
year(data)=2017
and month(data)=12
and year(r.dia)=2017
and month(r.dia)=12
--order by r.dia
union
select distinct
cod_cliente,
case when data is null then dia else data end,
cod_prod,
pertence_cesta
coalesce(vol_sellin_desconhecido,0) as vol_sellin,
from calendario as a
inner join (select * from tabela
) as b
on year(a.dia) = year(b.data)
and month(a.dia) = month(b.data)
and day(a.dia) = day(b.data)
and b.cod_prod = b.cod_prod
where year(dia)=2017
and month(dia)=12;Podem me ajudar?
Muito obrigado!
2017-N01-01;1;1;5;1
2017-01-02;1;1;7;1
2017-01-04;1;1;8;1
2017-01-05;1;1;12;1
Respostas
-
Bom dia,
Experimente fazer uns testes dessa forma para ver se é obtido o resultado esperado:
with CTE_CliProd as ( select distinct cod_cliente, cod_prod, pertence_cesta from tabela ) select r.dia, n.cod_cliente, n.cod_prod, 0, n.pertence_cesta from CTE_CliProd as n cross join calendario as r where r.dia between '20171201' and '20171231' and not exists (select 1 from tabela as s where s.cod_cliente = n.cod_cliente and s.cod_prod = n.cod_prod and
s.pertence_cesta = n.pertence_cesta and s.data = r.dia)
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Editado gapimex terça-feira, 6 de março de 2018 14:32
- Sugerido como Resposta Juliano Nunes Silva Oliveira terça-feira, 6 de março de 2018 16:54
- Marcado como Resposta Fabio Hideo quinta-feira, 8 de março de 2018 18:13
Todas as Respostas
-
Bom dia,
Experimente fazer uns testes dessa forma para ver se é obtido o resultado esperado:
with CTE_CliProd as ( select distinct cod_cliente, cod_prod, pertence_cesta from tabela ) select r.dia, n.cod_cliente, n.cod_prod, 0, n.pertence_cesta from CTE_CliProd as n cross join calendario as r where r.dia between '20171201' and '20171231' and not exists (select 1 from tabela as s where s.cod_cliente = n.cod_cliente and s.cod_prod = n.cod_prod and
s.pertence_cesta = n.pertence_cesta and s.data = r.dia)
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Editado gapimex terça-feira, 6 de março de 2018 14:32
- Sugerido como Resposta Juliano Nunes Silva Oliveira terça-feira, 6 de março de 2018 16:54
- Marcado como Resposta Fabio Hideo quinta-feira, 8 de março de 2018 18:13
-
-
Veja esta resposta do StackOverflow: https://stackoverflow.com/a/3306122/1184708
Juliano Nunes - http://linkedin.com/in/julianonunes
Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.
Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.
-
Fabio,
O insert funciona sim, ao invés de realizar o Select da CTE você terá que executar o Insert baseado na CTE logo após a declaração do bloco de código da CTE.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]