none
Update com informações de duas tabelas diferentes RRS feed

  • Pergunta

  • Boa tarde,

    Preciso atualizar o preço de custo em uma tabela de venda, baseado com o preço que o produto entrou.

    Por exemplo:

    Tabela de Venda:

    Data            -    Produto       -   Custo

    01/05/2013 -   12345           -  1,00

    02/05/2013 -   12345           -  1,00

    03/05/2013 -   12345           -  1,50

    04/05/2013 -   12345           -  2,00

    Tabela de entrada de notas:

    Entrou duas notas,

    01/05/2013 -   12345           -  2,00

    04/05/2013 -   12345           -  5,00

    Então preciso que na tabela de venda ficasse da seguinte forma.

    01/05/2013 -   12345           -  2,00

    02/05/2013 -   12345           -  2,00

    03/05/2013 -   12345           -  2,00

    04/05/2013 -   12345           -  5,00

    Nota-se que não vou ter nota de entrada todos os dias, porém posso ter venda, então levaria em consideração a ultima nota que entrou com a data mais proxima para arrumar o preço.

    Alguem pode me ajudar?

    Grato

    quinta-feira, 16 de maio de 2013 18:14

Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    update v
    set Custo = 
            ( select top 1 Custo
              from Notas as n
              where 
                  n.Produto = v.Produto and
                  n.Data <= v.Data
              order n.Data desc )
    from Venda as v

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Andre_Paulo quinta-feira, 16 de maio de 2013 18:51
    quinta-feira, 16 de maio de 2013 18:22
  • Olá,

    O que precisas de fazer é, em primeiro lugar, criar a query com os resultados esperados. Depois é só fazer o Update.

    Assim:

    USE tempdb;
    GO
    
    -- Cria tabelas para teste
    CREATE TABLE Venda (Data DATE, Produto INT, Custo NUMERIC(10, 2));
    CREATE TABLE Notas (Data DATE, Produto INT, Custo NUMERIC(10, 2));
    
    -- Insere os dados de teste
    INSERT INTO Venda VALUES ('20130501', 12345, 1.00), ('20130502', 12345, 1.00), ('20130503', 12345, 1.50), ('20130504', 12345, 2.00);
    INSERT INTO Notas VALUES ('20130501', 12345, 2.00), ('20130504', 12345, 5.00);
    
    -- Mostra os resultados pretendidos
    SELECT V.Data, V.Produto, (SELECT TOP 1 N.Custo FROM Notas N WHERE N.Produto = V.Produto AND N.Data <= V.Data ORDER BY Data DESC)
    	FROM Venda V
    
    -- Faz o Update à tabela Venda
    UPDATE Venda
    	SET Custo = T.Custo
    	FROM
    	(
    		SELECT V.Data, V.Produto, (SELECT TOP 1 N.Custo FROM Notas N WHERE N.Produto = V.Produto AND N.Data <= V.Data ORDER BY Data DESC) AS Custo
    			FROM Venda V
    	) T
    		WHERE Venda.Data = T.Data AND Venda.Produto = T.Produto
    
    -- E... "Voilá", os resultados esperados
    SELECT * FROM Venda;
    
    -- Elimina as tabelas temporárias
    DROP TABLE Venda;
    DROP TABLE Notas;

    Espero ter ajudado,


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.

    Pedro Martins
    Portugal
    https://www.linkedin.com/in/rechousa

    quinta-feira, 16 de maio de 2013 18:29

Todas as Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    update v
    set Custo = 
            ( select top 1 Custo
              from Notas as n
              where 
                  n.Produto = v.Produto and
                  n.Data <= v.Data
              order n.Data desc )
    from Venda as v

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Andre_Paulo quinta-feira, 16 de maio de 2013 18:51
    quinta-feira, 16 de maio de 2013 18:22
  • Olá,

    O que precisas de fazer é, em primeiro lugar, criar a query com os resultados esperados. Depois é só fazer o Update.

    Assim:

    USE tempdb;
    GO
    
    -- Cria tabelas para teste
    CREATE TABLE Venda (Data DATE, Produto INT, Custo NUMERIC(10, 2));
    CREATE TABLE Notas (Data DATE, Produto INT, Custo NUMERIC(10, 2));
    
    -- Insere os dados de teste
    INSERT INTO Venda VALUES ('20130501', 12345, 1.00), ('20130502', 12345, 1.00), ('20130503', 12345, 1.50), ('20130504', 12345, 2.00);
    INSERT INTO Notas VALUES ('20130501', 12345, 2.00), ('20130504', 12345, 5.00);
    
    -- Mostra os resultados pretendidos
    SELECT V.Data, V.Produto, (SELECT TOP 1 N.Custo FROM Notas N WHERE N.Produto = V.Produto AND N.Data <= V.Data ORDER BY Data DESC)
    	FROM Venda V
    
    -- Faz o Update à tabela Venda
    UPDATE Venda
    	SET Custo = T.Custo
    	FROM
    	(
    		SELECT V.Data, V.Produto, (SELECT TOP 1 N.Custo FROM Notas N WHERE N.Produto = V.Produto AND N.Data <= V.Data ORDER BY Data DESC) AS Custo
    			FROM Venda V
    	) T
    		WHERE Venda.Data = T.Data AND Venda.Produto = T.Produto
    
    -- E... "Voilá", os resultados esperados
    SELECT * FROM Venda;
    
    -- Elimina as tabelas temporárias
    DROP TABLE Venda;
    DROP TABLE Notas;

    Espero ter ajudado,


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.

    Pedro Martins
    Portugal
    https://www.linkedin.com/in/rechousa

    quinta-feira, 16 de maio de 2013 18:29
  • As duas respostas deu certo.

    Grato

    Andre

    quinta-feira, 16 de maio de 2013 18:56