none
Como pesquisar dados em uma coluna e trazer e somar os dados

    Question

  • Boa noite, pessoal.

    estou com uma dúvida no Sql Server 2005.

    Na tabela abaixo eu tenho o campo (coluna) G1_COD (código do produto) na coluna ao lado G1_COMP (componente do produto) e na outra coluna CPV_JAN_2011 (Custo do produto vendido Janeiro 2011).

    O produto  0300702623 é composto pelo componente TC0205701, este último é composto pelo TC0200701 que é composto pelo MP0430701 e MP0808. Preciso achar uma função para somar estes valores conforme abaixo:

    G1_COD G1_COMP  CPV_JAN_2011 
    0300702623      CP0302                            0,03
    0300702623      CP0401                            0,09
    0300702623      CP1801                            0,01
    0300702623      CP1825                            0,01
    0300702623      EB0403                            0,02
    0300702623      TC0205701        NULL  <== este campo tem que dar 1,10
    TC0205701       TC0200701        NULL  <== este campo tem que dar 1,10
    TC0200701       MP0430701                         0,63 A somatória deste dois valores é 1,10
    TC0200701       MP0808                            0,47

     Alguem tem alguma ideia qual a função eu posso utilizar para somar dados de uma coluna em outra (como se fosse o somase do excel).

    Abçs,

    Anderson Veiga 

    Thursday, November 10, 2011 1:08 AM

All replies

  • Olá Anderson,

    Na realidade tu teria que ter uma forma de identificar qual código é composto por quais outros códigos, esta é o primeiro passo.

    Depois disso, basta tu criar uma função que atualize o campo do valor de acordo com tua condição.

    Neste exemplo tua função deve receber os parâmetros que consigam filtrar exclusivamente o registro que tu precisa e fazer o o update.

     

    drop table teste5 
    create table teste5 (G1_COD varchar(20), G1_COMP varchar(20), CPV_JAN_2011 float);
    
    
    insert into teste5(G1_COD,G1_COMP,CPV_JAN_2011) values
    ('0300702623','CP0302',0.03),
    ('0300702623','CP0401',0.09),
    ('0300702623','CP1801',0.01),
    ('0300702623','CP1825',0.01),
    ('0300702623','EB0403',0.02),
    ('TC0200701','MP0430701',0.63),
    ('TC0200701','MP0808',0.47)
    
    
    insert into teste5 values ('0300702623','TC0205701',NULL)
    
    -- AQUI DEVE CHAMAR TUA PROCEDURE QUE FAÇA ESSE COMANDO ABAIXO SUBSTITUINDO OS VALORES DO WHERE PELOS PARÂMETROS DE ENTRADA DA PROC.
    update teste5 set CPV_JAN_2011= (select sum(CPV_JAN_2011) from teste5 where G1_COD = 'TC0200701') where G1_COD = '0300702623' and G1_COMP = 'TC0205701'
    


    Veja se essa idéia é o que tu precisa, se tiver problemas com a proc avisa que eu te mando uma ideia de como poderia fazer.

    Espero ter ajudado, vlew.

    Thursday, November 10, 2011 11:01 AM
  • Anderson,

    Concordo com o Marcus, de alguma forma você terá que montar uma estrutura que armazene todo a sequência de elementos relacionados para que depois você possa buscar estes dados e realizar os cálculos.

    Já realizei fazer este tipo de análise, abaixo disponibilizo uma ideia do código:]

    Create Procedure [dbo].[P_RegistroHistorico_PesquisaMovimentacaoParcial] @NUMPVM CHAR(7)
    AS
    Begin

    Set NoCount ON

    Truncate Table CTProducao_RegistroHistoricoParcial
    Truncate Table ResumoResultadosMP
    Truncate Table ResumoResultadosMO

    Declare  @NumControle Char(7),
                @Contador Int,
                @CodSigla Char(2)

    Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NUMMO, NumControle, DescricaoProduto, CodSigla)
    Select @NUMPVM,
             NULL,
             CTPVMI.NUMCONTROLE,
             MO.DescricaoProduto,
             'MO' As Sigla
    from CTProducao_PVM_Items CTPVMI Inner Join CTProducao_Moinho MO
                                                        ON CTPVMI.NUMCONTROLE = MO.NUMMO
    Where CTPVMI.NUMPVM = @NumPVM
    And     CTPVMI.CodSigla = 'MO'
    Union
    Select @NUMPVM,
             NULL,
             CTPVMI.NUMCONTROLE,
             MP.Descricao,
             'MP' As Sigla
    from CTProducao_PVM_Items CTPVMI Inner Join CTEntrada_PQC MP
                                                        ON CTPVMI.NUMCONTROLE = MP.NUMMP
    Where CTPVMI.NUMPVM = @NumPVM
    And     CTPVMI.CodSigla = 'MP'
    Order By CTPVMI.NumControle DESC

    Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NumControle, DescricaoProduto, CodSigla)
    Select  @NumPVM, NumRecebimento, DescricaoProduto, 'LT' From CTProducao_PVM
    Where NUMPVM=@NUMPVM

    If (Select Segundo_NumRecebimento From CTProducao_PVM Where NUMPVM = @NUMPVM) <> Null
     Begin
      Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NumControle, DescricaoProduto, CodSigla)
      Select  @NumPVM, NumRecebimento, DescricaoProduto, 'LT' From CTProducao_PVM
      Where NUMPVM=@NUMPVM
     End

    Declare CTProducao_PVM_Itens_Cursor Cursor For
    Select NUMCONTROLE, CodSigla from CTProducao_PVM_Items
    Where NUMPVM = @NUMPVM
     
    Open CTProducao_PVM_Itens_Cursor
     
    Set @Contador = 0

     While @Contador < (Select Count(NUMPVM) From CTProducao_PVM_Items Where NumPVM = @NumPVM)
       Begin
        Fetch Next From CTProducao_PVM_Itens_Cursor
        Into @NumControle, @CodSigla
      
         If @CodSigla = 'MO'
          Begin            
            Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NUMMO, NumControle, DescricaoProduto, CodSigla)
            Select @NUMPVM,
                     CTPMOI.NUMMO,
                     CTPMOI.Numcontrole,
                     CTPMOI.DescricaoProduto,
                     CTPMOI.CodSigla
            From CTProducao_Moinho CTPMoinho Inner Join CTProducao_Moinho_Items CTPMOI
                                                               On CTPMoinho.NumMO = CTPMOI.NumMO
            Where CTPMoinho.NumMO = @NumControle
           End       

          If @CodSigla = 'MP'
           Begin
            Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NUMMO, NumControle, DescricaoProduto, CodSigla)
            Select @NUMPVM,
                      CTPMOI.NUMMO,
                      CTPMOI.NumControle,
                      CTPMOI.DescricaoProduto,
                      CTPMOI.CodSigla
             From CTEntrada_PQC CTEPQC Inner Join CTProducao_Moinho_Items CTPMOI
                                                       On CTEPQC.NumMP = CTPMOI.NumControle
             Where CTPMOI.NumMO = @NumControle
            End

        Set @Contador = @Contador + 1
       End

     CLOSE CTProducao_PVM_Itens_Cursor
     DEALLOCATE CTProducao_PVM_Itens_Cursor

     Execute dbo.P_RegistroHistorico_ResumoResultadosPVMxMOxMP
    End

     


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    Thursday, November 10, 2011 11:38 PM
  • Primeiramente quer agradecer a todos pela agilidade na resposta.

    Marcus, eu vou ter um problema com a sua resposta porque existem vários produtos com este  TC0205701, quero dizer o TC0205701 é um tecido que utilizamos para fazer uma cortina (código 0300702623) e este mesmo tecido serve para fazer outros produtos, por exemplo, Almofada, edredon, etc..

    Tem como fazer este update ser automático, para o produto 0300702623 e também para os outros?

    Muito obrigado.

    Anderson Veiga.

     

     

    Friday, November 11, 2011 12:30 AM
  • Junior Galvão, obrigado pela resposta, o problema é que eu ainda estou iniciando no SQL Server e não conheço todos os comandos que você postou acima.

    Mais uma vez obrigado e se você puder comentar um pouco mais os códigos acima vou ficar muito agradecido.

    Abçs,

    Anderson Veiga

     

    Friday, November 11, 2011 12:36 AM
  • Olá Anderson, estava analisando a situação e acredito que tu esta com o típico caso de produtos compostos.

    O que seria a solução ideal pra ti e através da análise é possível identificar.

    Tu precisaria normalizar teu diagrama ER e esta tua tabela viraria duas tabelas um com os produtos e um com material dos produtos.

    Dessa forma tu teria mais ou menos o seguinte, veja se isso resolve o teu problema e se é possível:

     

     

    create table teste5produtos(G1_COD int, G1_DESCRICAO varchar(30));
    
    create table teste5ItensDOproduto(H1_COD int, H1_DESCRICAO varchar(30), G1COD int, VALOR float);
    
    insert into teste5produtos values(0300702623,'CORTINA 1');
    
    insert into teste5ItensDOproduto values(120302,'TECIDO 1',0300702623,5.50),(120401,'TECIDO 2',0300702623,2.20),(120403,'TECIDO 2',0300702623,4.37);
    
      SELECT P.G1_COD, P.G1_DESCRICAO, SUM(VALOR) 
        FROM teste5produtos p inner join teste5ItensDOproduto i 
            ON i.G1COD = p.G1_COD 
    GROUP BY P.G1_COD, P.G1_DESCRICAO
    
    


    Para melhorar ainda mais este exemplo Anderson, os itens poderiam ter uma tabela para eles e tu só usaria o código deles nesta tabela dos ítens do produto, fazendo com que não se repetissem as informações de código e nome.

    Se for possível resolver teu problema assim eu me avisa que eu te mando um exemplo.

    Espero que ajude.

    Vlew.

     


    Thursday, December 22, 2011 10:48 AM