none
FOR EACH por registro RRS feed

  • Pergunta

  • Preciso criar uma tabela de CEP a partir de uma existente, como abaixo:

    Código Cidade              Início           Fim

    01        Belo Horizonte  30000-000   35000-000

    02        São Paulo         10000-000   19000-000

    ...

    Preciso desmembrar por CEP, ficando assim:

    Código  Cidade              CEP

    01        Belo Horizonte   30000-000

    02        Belo Horizonte   30000-001

    03        Belo Horizonte   30000-002

    ...

    49        Belo Horizonte   35000-000

    50        São Paulo          10000-000

    50        São Paulo          10000-001

    50        São Paulo          10000-002

    ...

    Alguém tem aquela solução básica que me escapa no momento?

    quinta-feira, 6 de julho de 2017 12:51

Respostas

Todas as Respostas

  • Bom dia,

    Alessandro, acho que você pode utilizar uma CTE recursiva conforme o exemplo abaixo:

    declare @Tabela table
    (Codigo int, Cidade varchar(40), Inicio char(9), Fim char(9));
    
    insert into @Tabela values
    (1, 'Belo Horizonte', '30000-000', '35000-000');
    
    with CTE_Rec as
    (
        select
            Cidade,
            cast(left(Fim, 5) + right(Fim, 3) as int) as Fim,
            cast(left(Inicio, 5) + right(Inicio, 3) as int) as Cep
        from @Tabela
        
        union all
        
        select
            Cidade,
            Fim,
            Cep + 1
        from CTE_rec
        where
            Cep < Fim
    )
    
    select 
        Cidade,
        cast(Cep / 1000 as char(5)) + '-' + right('00' + cast(Cep % 1000 as varchar), 3) as Cep
    from CTE_Rec
    OPTION (MAXRECURSION 0);

    Espero que ajude


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

    quinta-feira, 6 de julho de 2017 13:13
  • Bom dia Alessandro Cotó fiz um demo buscando seu objetivo

    veja a demo 

    DECLARE @TabelaCeps TABLE 
    (
     Codigo CHAR(2),
     Cidade VARCHAR(100),
     Inicio VARCHAR(12),
     Termino VARCHAR(12)
    )
    
    
    INSERT INTO @TabelaCeps
            ( Codigo, Cidade, Inicio, Termino )
    VALUES  ( '01','Belo Horizonte','30000-000','30001-000' ) ,--( '01','Belo Horizonte','30000-000','35000-000' )
    		 ( '02','São Paulo','10000-000','10001-000' )
    
    ;WITH DadosFormatados AS 
    (
    SELECT TC.Codigo ,
           TC.Cidade ,
           TC.Inicio ,
           TC.Termino,
    	   InicioFormatado=  CAST( REPLACE(TC.Inicio,'-','') AS BIGINT),
    	   TerminoFormatado=  CAST( REPLACE(TC.Termino,'-','') AS BIGINT)
    	    FROM @TabelaCeps AS TC
    	   
    	   
    ),
    Recursividade AS (
    SELECT DadosFormatados.Codigo ,
           DadosFormatados.Cidade ,
           DadosFormatados.Inicio ,
           DadosFormatados.Termino ,
           DadosFormatados.InicioFormatado ,
    	   [IntervaloCepInicio] = DadosFormatados.InicioFormatado + 1,
    	   [IntervaloCepTermino] = DadosFormatados.InicioFormatado + 2,
           DadosFormatados.TerminoFormatado FROM DadosFormatados
    	   UNION ALL
    	   SELECT R.Codigo ,
                  R.Cidade ,
                  R.Inicio ,
                  R.Termino ,
                  R.InicioFormatado ,
                  R.[IntervaloCepInicio] +1 ,
                  R.[IntervaloCepTermino] +1,
                  R.TerminoFormatado FROM Recursividade R
    			  WHERE R.[IntervaloCepInicio] +1 < R.TerminoFormatado
    	 
    ) 
    
    SELECT Recursividade.Codigo ,
           Recursividade.Cidade ,
           Recursividade.Inicio ,
           Recursividade.Termino ,
           Recursividade.InicioFormatado ,
           Recursividade.IntervaloCepInicio ,
           Recursividade.IntervaloCepTermino ,
           Recursividade.TerminoFormatado
    	    FROM Recursividade
    		ORDER BY Recursividade.Cidade
    		 OPTION(MAXRECURSION 32767)

    entretanto seu intervalo de dados  na cidade de  Belo Horizonte começa com  30000-000 até 35000-000

    como eu preciso fazer um parse para BIGINT a diferença da 

    SELECT FORMAT((35000000 -30000000),'N','pt-BR')  : 5.000.000,00

    Entretando a recursividade e limitada  a 

    32767

    alguma sugestão ??

    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves


    Wesley Neves

    quinta-feira, 6 de julho de 2017 13:53
  • Já ajudou bastante, Gapimex. Me esclareça uma coisa aqui: eu terei que fazer isso registro por registro da tabela matriz? São quase 2 milhões de registros de cidades com CEP inícial e CEP Final. Eu tô querendo é justamente um meio pra fazer isso tudo de uma vez só. Pelo que entendi do exemplo que me enviou, eu teria que fazer isso um por um... Ou entendi errado?
    quinta-feira, 6 de julho de 2017 14:11
  • Alessandro, no script que postei é utilizada uma variável de tabela para demonstrar o funcionamento da CTE recursiva, mas você pode remover essa variável de tabela do script para utilizar a sua tabela para gerar as linhas desejadas.

    Espero que ajude


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

    quinta-feira, 6 de julho de 2017 14:22
  • Wesley, os dados que coloquei foram apenas exemplos. Os intervalos de CEP são menores, pois são separados por bairros. Cada registro de um bairro (ou até mesmo Rua) tem Início e Fim. O meu problema é que são quase 2 milhões de registros. No lugar onde vc colocar os dados manualmente (VALUES  ( '01','Belo Horizonte','30000-000','30001-000' ) ,( '02','São Paulo','10000-000','10001-000' )) eu consigo colocar todos os 2M de registros da tabela primária?
    quinta-feira, 6 de julho de 2017 14:38
  • Alessandro, no script que postei é utilizada uma variável de tabela para demonstrar o funcionamento da CTE recursiva, mas você pode remover essa variável de tabela do script para utilizar a sua tabela para gerar as linhas desejadas.

    Espero que ajude


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

    Agora sim. Acho que isso então resolve meu problema. Vou tentar aqui.

    Muitíssimo obrigado, Gapimex!

    quinta-feira, 6 de julho de 2017 14:39
  • Sim, mas ae a estrutura muda, seá melhor criar uma tabela temporária  e fazer um 

    Insert into #TabelaParaGerarCeps from select Campos from sua Tabela

    fiz uma outra solução usando a inteligencia do mestre gapimex

    para extrair o cep 

    CEPInicio = cast(RES.IntervaloCepInicio / 1000 as char(5)) + '-' + right('00' + cast(RES.IntervaloCepInicio % 1000 as varchar), 3),

    seque

    DECLARE @TabelaCeps TABLE 
    (
     Codigo CHAR(2),
     Cidade VARCHAR(100),
     Inicio VARCHAR(12),
     Termino VARCHAR(12)
    )
    
    
    INSERT INTO @TabelaCeps
            ( Codigo, Cidade, Inicio, Termino )
    VALUES  ( '01','Belo Horizonte','30000-000','30002-000' ), --( '01','Belo Horizonte','30000-000','35000-000' )
    		 ( '02','São Paulo','10000-000','10010-000' ) --( '02','São Paulo','10000-000','19000-000' )
    
    ;WITH DadosFormatados AS 
    (
    SELECT TC.Codigo ,
           TC.Cidade ,
           TC.Inicio ,
           TC.Termino,
    	   InicioFormatado=  CAST( REPLACE(TC.Inicio,'-','') AS BIGINT),
    	   TerminoFormatado=  CAST( REPLACE(TC.Termino,'-','') AS BIGINT)
    	    FROM @TabelaCeps AS TC
    	   
    	   
    ),
    Recursividade AS (
    SELECT DadosFormatados.Codigo ,
           DadosFormatados.Cidade ,
           DadosFormatados.Inicio ,
           DadosFormatados.Termino ,
           DadosFormatados.InicioFormatado ,
    	   [IntervaloCepInicio] =  DadosFormatados.InicioFormatado,
    	   [IntervaloCepTermino] = DadosFormatados.InicioFormatado +1,
           DadosFormatados.TerminoFormatado FROM DadosFormatados
    	   UNION ALL
    	   SELECT R.Codigo ,
                  R.Cidade ,
                  R.Inicio ,
                  R.Termino ,
                  R.InicioFormatado ,
                  R.[IntervaloCepInicio] +1 ,
                  R.[IntervaloCepTermino] +1,
                  R.TerminoFormatado FROM Recursividade R
    			  WHERE R.IntervaloCepInicio + 1 < R.TerminoFormatado
    	 
    ) 
    
    SELECT
    		-- RES.Codigo ,
           RES.Cidade ,
           RES.Inicio ,
           RES.Termino ,
           RES.InicioFormatado ,
    	   RES.TerminoFormatado,
           RES.IntervaloCepInicio ,
           RES.IntervaloCepTermino ,
    	   CEPInicio = cast(RES.IntervaloCepInicio / 1000 as char(5)) + '-' + right('00' + cast(RES.IntervaloCepInicio % 1000 as varchar), 3),
    	   CEPTermino = cast(RES.IntervaloCepTermino / 1000 as char(5)) + '-' + right('00' + cast(RES.IntervaloCepTermino % 1000 as varchar), 3)
    	    FROM Recursividade RES
    		ORDER BY RES.Cidade,RES.IntervaloCepInicio
    		 OPTION(MAXRECURSION 0)
    
    		


    Wesley Neves - Brasilia-DF


    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 


    Wesley Neves

    quinta-feira, 6 de julho de 2017 14:46
  • Deleted
    quinta-feira, 6 de julho de 2017 14:56
  • Bom dia,

    Por falta de retorno, essa thread está sendo encerrada.

    Se necessário, deverá ser aberta uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 11 de julho de 2017 13:58
    Moderador