Usuário com melhor resposta
Inserir dados de outras tabelas

Pergunta
-
Olá pessoal, estou com o seguinte, problema, quero inserir dados de outras tabelas em uma que criei, usei este comando inicial:
SELECT SUBSTRING(SZ4.Z4_OP,1,6) AS Z9_OP, SUM(SB1.B1_CUSTD*SZ4.Z4_QUANT) AS Z9_SOLICT
INTO SZ9040
FROM SZ4040 SZ4
INNER JOIN SB1020 SB1
ON SB1.B1_COD = SZ4.Z4_PRODUTO
WHERE SZ4.D_E_L_E_T_ = ''
AND Z4_OP LIKE 'P00%'
GROUP BY SUBSTRING(Z4_OP,1,6)
ORDER BY SUBSTRING(Z4_OP,1,6)Esse funcionou, criou a minha tabela perfeitamente, o problema está ao inserir dados de outras tabelas, usei este comando:
INSERT INTO SZ9040 (Z9_COMPRA, Z9_COMPRABT)
SELECT SUM(C7_TOTAL), SUM(C7_PRECO*(C7_QUANT-C7_QUJE))
FROM SC7040
WHERE D_E_L_E_T_ = ''
AND C7_ENTOP LIKE 'P00%'
GROUP BY SUBSTRING(C7_ENTOP,1,6)
ORDER BY SUBSTRING(C7_ENTOP,1,6)Ele inseriu, mas os campos da tabela anterior e esses foram criados ele preencheu com dados Null, como consigo copiar corretamente os dados? Obrigado.
Respostas
-
Bom dia,
Experimente essa versão:
with CTE_Z4 as ( SELECT SUBSTRING(SZ4.Z4_OP,1,6) AS Z4_OP, SUM(SB1.B1_CUSTD*SZ4.Z4_QUANT) AS Z4_SOLICT FROM SZ4040 SZ4 INNER JOIN SB1020 SB1 ON SB1.B1_COD = SZ4.Z4_PRODUTO WHERE SZ4.D_E_L_E_T_ = '' AND Z4_OP LIKE 'P00%' GROUP BY SUBSTRING(Z4_OP,1,6) ), CTE_C7 as ( SELECT SUBSTRING(C7_ENTOP,1,6) as C7_OP, SUM(C7_TOTAL) as C7_COMPRA, SUM(C7_PRECO*(C7_QUANT-C7_QUJE)) as C7_COMPRABT FROM SC7040 WHERE D_E_L_E_T_ = '' AND C7_ENTOP LIKE 'P00%' GROUP BY SUBSTRING(C7_ENTOP,1,6) ) select coalesce(Z4.Z4_OP, C7.C7_OP) as Z9_OP, Z4.Z4_SOLICT AS Z9_SOLICT, C7.C7_COMPRA AS Z9_COMPRA, C7.C7_COMPRABT AS Z9_COMPRABT INTO SZ9040 from CTE_Z4 as Z4 full join CTE_C7 as C7 on C7.C7_OP = Z4.Z4_OP
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 15:44
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 16:51
-
opa! Pelo que estou vendo essas tabelas são do bom e velho Protheus.
Acho que a pior forma de obter informação é quando a coluna de alguma linha que pode ser somada possui valor null ou por algum equivoco está como varchar(Do Protheus eu não acredito). Portanto, peço que verifique as colunas informadas porque 4*null = null, mas isnull(4*null,0.00) = 0.00
Outra solução é dividir a query para encontrar o problema.
Primeiro vamos ao insert: Verifique se os campos são do mesmo tipo, pois se for de outro não compatível, talvez seja necessário converter.
rode o select separado e veja o retorno.
"SELECT SUM(C7_TOTAL), SUM(C7_PRECO*(C7_QUANT-C7_QUJE))
FROM SC7040
WHERE D_E_L_E_T_ = ''
AND C7_ENTOP LIKE 'P00%'
GROUP BY SUBSTRING(C7_ENTOP,1,6)
ORDER BY SUBSTRING(C7_ENTOP,1,6) "*TENDO CERTEZA QUE O SELECT TRAZ OS DADOS ESPERADOS, ENTÃO O PROBLEMA PODE ESTAR NA TABELA DESTINO OU NOS CAMPOS DESTINO, SENÃO O SELECT VAI ESTAR ERRADO.
AÍ SIM, DEPOIS VAMOS VER SE OS DADOS IMPORTADOS ESTÃO CORRETOS.
LEMBRE: "DIVIDIR PARA CONSQUISTAR."
- Editado jmarqDeveloper terça-feira, 27 de maio de 2014 17:30 erro de texto
- Sugerido como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:30
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 16:51
Todas as Respostas
-
Bom dia,
William, não sei se entendi corretamente, mas se você pretende juntar as linhas retornadas pelas duas querys utilizando o código da operação, experimente:
with CTE_Z4 as ( SELECT SUBSTRING(SZ4.Z4_OP,1,6) AS Z4_OP, SUM(SB1.B1_CUSTD*SZ4.Z4_QUANT) AS Z4_SOLICT FROM SZ4040 SZ4 INNER JOIN SB1020 SB1 ON SB1.B1_COD = SZ4.Z4_PRODUTO WHERE SZ4.D_E_L_E_T_ = '' AND Z4_OP LIKE 'P00%' GROUP BY SUBSTRING(Z4_OP,1,6) ), CTE_C7 as ( SELECT SUBSTRING(C7_ENTOP,1,6) as C7_OP, SUM(C7_TOTAL) as C7_COMPRA, SUM(C7_PRECO*(C7_QUANT-C7_QUJE)) as C7_COMPRABT FROM SC7040 WHERE D_E_L_E_T_ = '' AND C7_ENTOP LIKE 'P00%' GROUP BY SUBSTRING(C7_ENTOP,1,6) ) select coalesce(Z4.Z4_OP, C7.C7_OP) as Z9_OP, Z4.Z4_SOLICIT AS Z9_SOLICIT, C7.C7_COMPRA AS Z9_COMPRA, C7.C7_COMPRABT AS Z9_COMPRABT INTO SZ9040 from CTE_Z4 as Z4 full join CTE_C7 as C7 on C7.C7_OP = Z9.Z9_OP
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Opa, muito obrigado por sua resposta, ele ocorreu um pequeno erro, mas o que fazendo é o seguite, executo um SELECT INTO, ele cria a tabela e insere os dados conforme o meu select, agora quero inserir dados de outra tabela, quando uso INSERT INTO, ele insere os dados corretamente, mas o problema é que insere valores Null, nas colunas, o meu select gera 113 rows, o insert também gera 113 rows, mas ele cria esse Null, ficando com 226.
-
Quantas linhas deveriam ser inseridas no total? 113?
Qual coluna seria utilizada para juntar os dados do Select Into com os do Insert Into? Z9_OP?
Você conseguiu executar a instrução que sugeri? Se não conseguiu, qual mensagem de erro está sendo exibida?
Assinatura: http://www.imoveisemexposicao.com.br
- Sugerido como Resposta Ricardo Barbosa Cortes segunda-feira, 26 de maio de 2014 16:58
- Não Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 11:47
-
Então amigo, sim, são 113 linhas e quatro colunas, 2 de uma tabela e duas de outra, com o SELECT INSERT, ele cria a tabela e insere as 113 linhas e 2 colunas, tudo ok, sem valor nulo, ao inserir as outras duas colunas de outra tabela, ele insere valores null, nas colunas anteriores e na nova que foi inserida, ficando 226 linhas, o erro que ocorre é esse:
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "Z9.Z9_OP" could not be bound.
Msg 207, Level 16, State 1, Line 33
Invalid column name 'Z4_SOLICIT'.No final INTO SZ9040, fiz isso para ver se corrigia INTO SZ9040 as Z9, mas ocorreu esse erro também:
Msg 156, Level 15, State 1, Line 36
Incorrect syntax near the keyword 'AS'. -
Com o seu script você vai obter esse resultado mesmo, já que o Insert inseri novas linhas na tabela.
Voltando a minha sugestão, experimente alterar:
- Z9.Z9_OP para Z4.Z9_OP
- Z4_SOLICIT as Z9_SOLICIT para Z4_SOLICT as Z9_SOLICT
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 11:47
- Não Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 15:44
-
-
Bom dia,
Experimente essa versão:
with CTE_Z4 as ( SELECT SUBSTRING(SZ4.Z4_OP,1,6) AS Z4_OP, SUM(SB1.B1_CUSTD*SZ4.Z4_QUANT) AS Z4_SOLICT FROM SZ4040 SZ4 INNER JOIN SB1020 SB1 ON SB1.B1_COD = SZ4.Z4_PRODUTO WHERE SZ4.D_E_L_E_T_ = '' AND Z4_OP LIKE 'P00%' GROUP BY SUBSTRING(Z4_OP,1,6) ), CTE_C7 as ( SELECT SUBSTRING(C7_ENTOP,1,6) as C7_OP, SUM(C7_TOTAL) as C7_COMPRA, SUM(C7_PRECO*(C7_QUANT-C7_QUJE)) as C7_COMPRABT FROM SC7040 WHERE D_E_L_E_T_ = '' AND C7_ENTOP LIKE 'P00%' GROUP BY SUBSTRING(C7_ENTOP,1,6) ) select coalesce(Z4.Z4_OP, C7.C7_OP) as Z9_OP, Z4.Z4_SOLICT AS Z9_SOLICT, C7.C7_COMPRA AS Z9_COMPRA, C7.C7_COMPRABT AS Z9_COMPRABT INTO SZ9040 from CTE_Z4 as Z4 full join CTE_C7 as C7 on C7.C7_OP = Z4.Z4_OP
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 15:44
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 16:51
-
opa! Pelo que estou vendo essas tabelas são do bom e velho Protheus.
Acho que a pior forma de obter informação é quando a coluna de alguma linha que pode ser somada possui valor null ou por algum equivoco está como varchar(Do Protheus eu não acredito). Portanto, peço que verifique as colunas informadas porque 4*null = null, mas isnull(4*null,0.00) = 0.00
Outra solução é dividir a query para encontrar o problema.
Primeiro vamos ao insert: Verifique se os campos são do mesmo tipo, pois se for de outro não compatível, talvez seja necessário converter.
rode o select separado e veja o retorno.
"SELECT SUM(C7_TOTAL), SUM(C7_PRECO*(C7_QUANT-C7_QUJE))
FROM SC7040
WHERE D_E_L_E_T_ = ''
AND C7_ENTOP LIKE 'P00%'
GROUP BY SUBSTRING(C7_ENTOP,1,6)
ORDER BY SUBSTRING(C7_ENTOP,1,6) "*TENDO CERTEZA QUE O SELECT TRAZ OS DADOS ESPERADOS, ENTÃO O PROBLEMA PODE ESTAR NA TABELA DESTINO OU NOS CAMPOS DESTINO, SENÃO O SELECT VAI ESTAR ERRADO.
AÍ SIM, DEPOIS VAMOS VER SE OS DADOS IMPORTADOS ESTÃO CORRETOS.
LEMBRE: "DIVIDIR PARA CONSQUISTAR."
- Editado jmarqDeveloper terça-feira, 27 de maio de 2014 17:30 erro de texto
- Sugerido como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:30
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 16:51
-
-
-
Boa tarde,
William, não sei se você está se referindo a query que sugeri... se estiver, a princípio é possível sim.
Assinatura: http://www.imoveisemexposicao.com.br
-
-
Se os dados dessa outra tabela também serão agrupados antes de serem inseridos, então você pode adicionar mais uma CTE para fazer o agrupamento.
Depois você pode fazer mais um Join no Select final para adicionar os dados agrupados.
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br