none
Inserir dados de outras tabelas RRS feed

  • 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.

    segunda-feira, 26 de maio de 2014 10:49

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

    terça-feira, 27 de maio de 2014 13:23
  • 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."


    terça-feira, 27 de maio de 2014 17:29

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

    segunda-feira, 26 de maio de 2014 12:57
  • 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.
    segunda-feira, 26 de maio de 2014 13:49
  • 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

    segunda-feira, 26 de maio de 2014 14:23
  • 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'.

    segunda-feira, 26 de maio de 2014 16:05
  • 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

    segunda-feira, 26 de maio de 2014 17:26
  • Bom dia amigo, fiz o que me pediste, mas o erro continua:

    Msg 207, Level 16, State 1, Line 39
    Invalid column name 'Z9_OP'.
    Msg 207, Level 16, State 1, Line 33
    Invalid column name 'Z4_SOLICIT'.

    terça-feira, 27 de maio de 2014 12:45
  • 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

    terça-feira, 27 de maio de 2014 13:23
  • 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."


    terça-feira, 27 de maio de 2014 17:29
  • Bom Dia amigo e obrigado pelas respostas, e essa sua última query funcionou perfeitamente, exatamente o resultado que eu queria, muito obrigado mesmo.

    Valeu!!!!

    quarta-feira, 28 de maio de 2014 12:52
  • Só mais uma pergunta, seguindo essa mesna query, é possível incorporar mais uma tabela? Obrigado.
    quarta-feira, 28 de maio de 2014 16:31
  • 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

    quarta-feira, 28 de maio de 2014 17:17
  • Sim, é a sua query (a ultima que enviasse) que funcionou perfeitamente, gostaria de incluir mais uma tabela.
    quarta-feira, 28 de maio de 2014 17:19
  • 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

    quarta-feira, 28 de maio de 2014 19:45