none
Update numerando com nova coluna RRS feed

  • Pergunta

  • Boa tarde , preciso de uma ajuda de voces, acredito que seja algo simples  mais não to conseguindo por a logica em pratica. 

    Vamos lá tenho a seguinte tabela . 

    Exemplo 

    COD_COMPO    COD_PA     

    C0001               PROD001

    C0002               PROD001

    C0004               PROD001   

    C0006               PROD010

    C0012               PROD010

    C0100               PROD010

    essa é um tabela de composição de produto acabado , o que eu preciso fazer ?  eu preciso criar uma terceira coluna  para numerar esses componentes , Só que  essa numeração tem que  voltar para 01 toda vez que o codigo PA muda

    Exemplo

    COD_COMPO     COD_PA        REG_PA 

    C0001               PROD001          01

    C0002               PROD001          02

    C0004               PROD001          03

    C0006               PROD010          01

    C0012               PROD010          02

    C0100               PROD010          03

    Eu já tentei algumas funções lead() e lag() , ja fiz while , IF , sei que é algo simples e obvio mais toda vez que eu acerto a logica eu erro a sintaxe ou vice e versa  ,talvez seja a pouca experiencia , ..  isso é um UPDATE essa tabela não vai mais receber novos PA's nem novos componentes , ou seja vou fazer esse UPDATE uma vez e não farei mais alterações , é uma tabela Legado.  

    Data Types    COD_COMPO  varchar(100),     COD_PA    varchar(100), REG_PA   INT

    Alguém pode me dar um exemplo funcional de como fazer ?

      

    Desde já .. " Obrigado ".  







    • Editado Elielton010 segunda-feira, 2 de setembro de 2019 19:06
    segunda-feira, 2 de setembro de 2019 18:02

Respostas

  • Elielton010,

    Ok, veja abaixo se este complemente do exemplo anterior te ajuda:

    Alter Table Dados
     Add REG_PA VarChar(4)
    GO
    
    ;With CTEReg_PA (COD_COMPO, COD_PA, REG_PA)
    As
    (
    Select COD_COMPO, COD_PA,
           '0'+Convert(Varchar(2),ROW_NUMBER() OVER (Partition By COD_PA Order by COD_COMPO)) As REG_PA
    From Dados
    )
    Update Dados
    Set Dados.REG_PA = C.Reg_Pa
    From Dados D Inner Join CTEReg_PA C
                On D.Cod_Compo = C.Cod_Compo
                And D.Cod_PA = C.Cod_PA
    Go
    
    Select * From Dados

    Não realizei testes, poderá conter erros.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    segunda-feira, 2 de setembro de 2019 19:51
  • Deleted
    • Marcado como Resposta Elielton010 terça-feira, 3 de setembro de 2019 18:57
    segunda-feira, 2 de setembro de 2019 20:02

Todas as Respostas

  • Elielton010,

    Isso você deseja aplicar diretamente no momento em que o dado esta sendo inserido, ou seria somente por exemplo para exibir em algum tipo de relatório?

    Esta coluna realmente vai existir ou somente para apresentar esta mudança?

    Veja se este exemplo te ajuda:

    Create Table Dados
    (Cod_Compo Char(5),
     Cod_PA Char(7))
    Go
    
    Insert Into Dados (COD_COMPO, COD_PA)
    VALUES ('C0001','PROD001'),
    ('C0002','PROD001'),
    ('C0004','PROD001'),   
    ('C0006','PROD010'),
    ('C0012','PROD010'),
    ('C0100','PROD010')
    Go
    
    -- Utilizando a função Row_Number e Concat - SQL Server 2012 ou Superior --
    Select COD_COMPO, COD_PA,
           Concat('0', ROW_NUMBER() OVER (Partition By COD_PA Order by COD_COMPO)) As REG_PA
    From Dados
    Go
    
    -- Utilizando a função Row_Number e Convert - SQL Server 2008 ou inferior --
    Select COD_COMPO, COD_PA,
           '0'+Convert(Varchar(2),ROW_NUMBER() OVER (Partition By COD_PA Order by COD_COMPO)) As REG_PA
    From Dados
    Go

    Espero ter ajudado.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    segunda-feira, 2 de setembro de 2019 19:19
  • Boa tarde Junior

    Vou fazer um update na tabela , essa tabela é uma tabela de histórico ela não vai mais receber atualizações, produtos novos , exclusões etc , e sim a coluna vai realmente existir.  A minha ideia era fazer um  ALTER TABLE ADD COLUM  , e depois um UPDATE .


     

    segunda-feira, 2 de setembro de 2019 19:30
  • Elielton010,

    Ok, veja abaixo se este complemente do exemplo anterior te ajuda:

    Alter Table Dados
     Add REG_PA VarChar(4)
    GO
    
    ;With CTEReg_PA (COD_COMPO, COD_PA, REG_PA)
    As
    (
    Select COD_COMPO, COD_PA,
           '0'+Convert(Varchar(2),ROW_NUMBER() OVER (Partition By COD_PA Order by COD_COMPO)) As REG_PA
    From Dados
    )
    Update Dados
    Set Dados.REG_PA = C.Reg_Pa
    From Dados D Inner Join CTEReg_PA C
                On D.Cod_Compo = C.Cod_Compo
                And D.Cod_PA = C.Cod_PA
    Go
    
    Select * From Dados

    Não realizei testes, poderá conter erros.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    segunda-feira, 2 de setembro de 2019 19:51
  • Deleted
    • Marcado como Resposta Elielton010 terça-feira, 3 de setembro de 2019 18:57
    segunda-feira, 2 de setembro de 2019 20:02
  • Obrigado josé Diz e junior Galvão os dois exemplos me atenderam , juntos então melhor ainda, abaixo veja como ficou , usando a tabela real.

    ALTER TABLE ESTR ADD REG INT ;

    with seqPROD as (
    SELECT CODG1, CODCOMP, NOME, REG,
           seq=  Concat('0', ROW_NUMBER() OVER (Partition By CODG1 Order by CODCOMP))
      from  ESTR
    )
    UPDATE seqPROD
      set REG= seq;

    Muito obrigado.

    terça-feira, 3 de setembro de 2019 19:04
  • Deleted
    terça-feira, 3 de setembro de 2019 19:11
  • Elielton010,

    Ok, obrigado pelo retorno, estamos aqui para ajudar.

    Concordo com a observação do José Diz, verifique e valide qual deverá ser o formato dos dados a ser apresentado, bem como, o tipo de dados e tamanho da coluna.

    Caso os números devam sempre iniciar com zero independente da quantidade de caracter, você poderá manter o número zero e validar o tamanho desta coluna, sendo ela Char() ou Varchar().

    Mas como você esta fazendo uso do tipo de dados Int na sua abordagem, recomendo aplicar esta pequena alteração removendo a função Concat:

    seq=  ROW_NUMBER() OVER (Partition By CODG1 Order by CODCOMP)

     


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    terça-feira, 3 de setembro de 2019 22:47