SQL Server Developer Center > Fóruns do SQL Server > SQL Server - Desenvolvimento Geral > Desafio!!! Avançado... Linha/coluna - Update, Cursor, Row
Fazer uma PerguntaFazer uma Pergunta
 

RespondidoDesafio!!! Avançado... Linha/coluna - Update, Cursor, Row

  • terça-feira, 3 de novembro de 2009 12:43Sharp.BR Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     

    Olá pessoal bom dia,

    Estou com seguinte problema, no resultado da tabela 1, vindo de uma importação txt, feita
    varias transformações para chegar a esse resultado.

    Para concluir a finalização do formato, Não estou conseguindo fazer uma conversão para resultado parecido com a tabela 2.
    que é o objetivo desta importação.

    A ideia é criar uma nova tabela, com resultados parecido com a 2.
    Tentei com tabelas temporarias #temp, Cursor, RowSet para depois criar essa tabela mais não estou acertanto.

    As informações de nota fiscal e fornecedor esta misturada com os outros campos, ou seja,
    Descricao tem a notafiscal, e fornecedor é replicar a informação.

    Não estou conseguindo buscar essas informações que estão misturadas e preencher os
    campos Fornecedor e NotaFiscal corretamente.

    Podem me ajudar. Por favor! tenho um tempinho martelando nisto e não esta saindo.

    Versão Banco de Dados SQL Server 2000

    Tabela 1          
    RowNumber CodProduto Descrição Valor Fornecedor NotaFiscal
    8 N.Fiscal: 627 NULL 33-7 NULL
    9 306-9 BEMINAL 30`S 16 NULL NULL
    10 31523-0 MEL APIS FLORA 144G C/ GELEIA 5,9 NULL NULL
    12 2656-5 NOVOFER 120ML 0 NULL NULL
    26 22633-5 TIRAS-TESTE OPTIUM 25`S 43,2 NULL NULL
    27 23109-6 ACIDO ACETILSALICILICO 100MG 10`S G EMS 1,12 NULL NULL
    28 25317-0 MIODON 200MG 30`S 12,25 NULL NULL
    36 N.Fiscal: 628 NULL 33-10 NULL
    37 23275-0 CLOR METFORMINA 850MG 60`S E G 12,17 NULL NULL
    38 20540-0 SAB LIQ LUX SHOWER 250ML TOQUE 2,26 NULL NULL
    41 29319-9 TERM CLINICO CHRISPIM BLISTER 4,95 NULL NULL
    42 32711-5 TERM GERATHERM  OUV E TEST LAR 0 NULL NULL
    43 23276-9 FLUCONAZOL 150MG 2 CAPS EMS GE 30,24 NULL NULL
    47 N.Fiscal: 629 NULL 48-1 NULL
    48 31592-3 DES AXE SECO AERO 90G VICE 5,43 NULL NULL
    49 16673-1 SAB GRANADO BEBE 250ML GLICERI 5,5 NULL NULL
    50 25248-4 FR MONICA NOTURNA JUMBO MD 27 4,26 NULL NULL
    51 29461-6 SH SEDA 350ML BRILHO GLOSS 3,36 NULL NULL
    55 N.Fiscal: 630 NULL 33-7 NULL
    56 25317-0 MIODON 200MG 30`S 12,25 NULL NULL
    57 28287-1 BIOMULTI POLIV 30`S 13,51 NULL NULL
               
               
    Tabela 2          
    RowNumber CodProduto Descrição Valor Fornecedor NotaFiscal
    9 306-9 BEMINAL 30`S 16 33-7 627
    10 31523-0 MEL APIS FLORA 144G C/ GELEIA 5,9 33-7 627
    12 2656-5 NOVOFER 120ML 0 33-7 627
    26 22633-5 TIRAS-TESTE OPTIUM 25`S 43,2 33-7 627
    27 23109-6 ACIDO ACETILSALICILICO 100MG 10`S G EMS 1,12 33-7 627
    28 25317-0 MIODON 200MG 30`S 12,25 33-7 627
    37 23275-0 CLOR METFORMINA 850MG 60`S E G 12,17 33-10 628
    38 20540-0 SAB LIQ LUX SHOWER 250ML TOQUE 2,26 33-10 628
    41 29319-9 TERM CLINICO CHRISPIM BLISTER 4,95 33-10 628
    42 32711-5 TERM GERATHERM  OUV E TEST LAR 0 33-10 628
    43 23276-9 FLUCONAZOL 150MG 2 CAPS EMS GE 30,24 33-10 628
    48 31592-3 DES AXE SECO AERO 90G VICE 5,43 48-1 629
    49 16673-1 SAB GRANADO BEBE 250ML GLICERI 5,5 48-1 629
    50 25248-4 FR MONICA NOTURNA JUMBO MD 27 4,26 48-1 629
    51 29461-6 SH SEDA 350ML BRILHO GLOSS 3,36 48-1 629
    56 25317-0 MIODON 200MG 30`S 12,25 33-7 630
    57 28287-1 BIOMULTI POLIV 30`S 13,51 33-7 630

Respostas

  • terça-feira, 3 de novembro de 2009 13:37Leonardo Marcelino Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     RespondidoContém Código

    Sharp.br, bom dia segue uma sugestão utilizando cursor, porém não é a melhor forma de resolver, mas no momento acho que vai quebrar seu galho.

    -- tabela temporária
    DECLARE @tb TABLE 
    (
         RowNumber  TINYINT  
        ,CodProduto VARCHAR(80) NULL
        ,Descrição  VARCHAR(80) NULL
        ,Valor      MONEY       NULL
        ,Fornecedor VARCHAR(80) NULL
        ,NotaFiscal VARCHAR(80) NULL
    )
    
    -- populo a tabela temporária
    SET NOCOUNT ON
    
    INSERT @tb 
    SELECT 8 , 'N.Fiscal:' , '627', NULL ,'33-7' , NULL  UNION
    SELECT 9 , '306-9'    ,'BEMINAL 30`S',                16 , NULL, NULL  UNION
    SELECT 10, '31523-0','MEL APIS FLORA 144G C/ GELEIA', 5.9, NULL, NULL  UNION
    SELECT 12, '2656-5','NOVOFER 120ML',                  0  , NULL, NULL  UNION
    SELECT 26, '22633-5','TIRAS-TESTE OPTIUM 25`S',      43.2, NULL, NULL  UNION
    SELECT 27, '23109-6','ACIDO ACETILSALICILICO 100MG 10`S G EMS', 1.12,NULL,NULL  UNION
    SELECT 28, '25317-0','MIODON 200MG 30`S', 12.25,NULL,NULL  UNION
    SELECT 36, 'N.Fiscal:', '628', NULL,'33-10',NULL  UNION
    SELECT 37, '23275-0','CLOR METFORMINA 850MG 60`S E G', 12.17, NULL,NULL  UNION
    SELECT 38, '20540-0','SAB LIQ LUX SHOWER 250ML TOQUE', 2.26 , NULL,NULL  UNION
    SELECT 41, '29319-9','TERM CLINICO CHRISPIM BLISTER' , 4.95 , NULL,NULL  UNION
    SELECT 42, '32711-5','TERM GERATHERM  OUV E TEST LAR', 0    , NULL,NULL  UNION
    SELECT 43, '23276-9','FLUCONAZOL 150MG 2 CAPS EMS GE', 30.24, NULL,NULL  UNION
    SELECT 47, 'N.Fiscal:', '629', NULL, '48-1', NULL  UNION
    SELECT 48, '31592-3','DES AXE SECO AERO 90G VICE',     5.43,NULL ,NULL  UNION
    SELECT 49, '16673-1','SAB GRANADO BEBE 250ML GLICERI', 5.5 ,NULL ,NULL  UNION
    SELECT 50, '25248-4','FR MONICA NOTURNA JUMBO MD 27',  4.26,NULL ,NULL  UNION
    SELECT 51, '29461-6','SH SEDA 350ML BRILHO GLOSS',     3.36,NULL ,NULL  UNION
    SELECT 55, 'N.Fiscal:', '630', NULL, '33-7' ,NULL  UNION
    SELECT 56, '25317-0','MIODON 200MG 30`S',   12.25, NULL, NULL  UNION
    SELECT 57, '28287-1','BIOMULTI POLIV 30`S', 13.51, NULL, NULL 
    
    --::> Cria uma tabela temporária que ira armazenar os dados tratados
    DECLARE @tbResultado TABLE 
    (
         RowNumber  TINYINT  
        ,CodProduto VARCHAR(80) NULL
        ,Descrição  VARCHAR(80) NULL
        ,Valor      MONEY       NULL
        ,Fornecedor VARCHAR(80) NULL
        ,NotaFiscal VARCHAR(80) NULL
    )
    
    --::> Váriáveis que irão receber o valor das colunas no Cursor
    DECLARE 	 
         @csRowNumber  TINYINT  
        ,@csCodProduto VARCHAR(80)
        ,@csDescrição  VARCHAR(80)
        ,@csValor      MONEY      
        ,@csFornecedor VARCHAR(80)
        ,@csNotaFiscal VARCHAR(80)
        ,@NFiscalNOVA  INT
        ,@FornecNOVA   VARCHAR(10)
    	
    DECLARE csObjeto CURSOR FAST_FORWARD 
    FOR (	  
          SELECT RowNumber, CodProduto, Descrição, Valor, Fornecedor, NotaFiscal FROM @tb
    	)
    OPEN csObjeto
    FETCH NEXT FROM csObjeto INTO @csRowNumber, @csCodProduto, @csDescrição, @csValor, @csFornecedor, @csNotaFiscal
    
    WHILE (@@FETCH_STATUS = 0) BEGIN
    	
        IF ISNUMERIC(@csDescrição) = 1 BEGIN 
            SELECT 	@NFiscalNOVA = @csDescrição, 
                    @FornecNOVA  = @csFornecedor
        END
    	
        ELSE BEGIN
            INSERT INTO @tbResultado
            SELECT @csRowNumber, @csCodProduto, @csDescrição, @csValor, @FornecNOVA, @NFiscalNOVA
        END
    
        FETCH NEXT FROM csObjeto INTO @csRowNumber, @csCodProduto, @csDescrição, @csValor, @csFornecedor, @csNotaFiscal
    END
    
    CLOSE csObjeto 
    DEALLOCATE csObjeto
    
    --::> Exibi o resultado FINAL
    SELECT * FROM @tbResultado
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Marcado como RespostaSharp.BR terça-feira, 3 de novembro de 2009 14:10
    •  

Todas as Respostas

  • terça-feira, 3 de novembro de 2009 13:07Junior Galvão - MVPMVPMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Sharp.BR,

    Como você realizou o processo de importação dos dados?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
  • terça-feira, 3 de novembro de 2009 13:14Sharp.BR Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    atraves de um aplicativo já existente.. ele busca um txt(gerado de um relatorio de um sistema que não tempos acesso para modificação) por isso que o nº da nota esta em descrição.. e insere esses dados txt em uma tabela no sql server.

    Estava muito mistura diversas informações desnecessaria.
    agora o desafio é, pegar o que esta na tabela 1... transformar em tabela 2... para depois eu inserir corretamente nas tabelas relacionadas do sistema usando procedure.

  • terça-feira, 3 de novembro de 2009 13:37Leonardo Marcelino Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     RespondidoContém Código

    Sharp.br, bom dia segue uma sugestão utilizando cursor, porém não é a melhor forma de resolver, mas no momento acho que vai quebrar seu galho.

    -- tabela temporária
    DECLARE @tb TABLE 
    (
         RowNumber  TINYINT  
        ,CodProduto VARCHAR(80) NULL
        ,Descrição  VARCHAR(80) NULL
        ,Valor      MONEY       NULL
        ,Fornecedor VARCHAR(80) NULL
        ,NotaFiscal VARCHAR(80) NULL
    )
    
    -- populo a tabela temporária
    SET NOCOUNT ON
    
    INSERT @tb 
    SELECT 8 , 'N.Fiscal:' , '627', NULL ,'33-7' , NULL  UNION
    SELECT 9 , '306-9'    ,'BEMINAL 30`S',                16 , NULL, NULL  UNION
    SELECT 10, '31523-0','MEL APIS FLORA 144G C/ GELEIA', 5.9, NULL, NULL  UNION
    SELECT 12, '2656-5','NOVOFER 120ML',                  0  , NULL, NULL  UNION
    SELECT 26, '22633-5','TIRAS-TESTE OPTIUM 25`S',      43.2, NULL, NULL  UNION
    SELECT 27, '23109-6','ACIDO ACETILSALICILICO 100MG 10`S G EMS', 1.12,NULL,NULL  UNION
    SELECT 28, '25317-0','MIODON 200MG 30`S', 12.25,NULL,NULL  UNION
    SELECT 36, 'N.Fiscal:', '628', NULL,'33-10',NULL  UNION
    SELECT 37, '23275-0','CLOR METFORMINA 850MG 60`S E G', 12.17, NULL,NULL  UNION
    SELECT 38, '20540-0','SAB LIQ LUX SHOWER 250ML TOQUE', 2.26 , NULL,NULL  UNION
    SELECT 41, '29319-9','TERM CLINICO CHRISPIM BLISTER' , 4.95 , NULL,NULL  UNION
    SELECT 42, '32711-5','TERM GERATHERM  OUV E TEST LAR', 0    , NULL,NULL  UNION
    SELECT 43, '23276-9','FLUCONAZOL 150MG 2 CAPS EMS GE', 30.24, NULL,NULL  UNION
    SELECT 47, 'N.Fiscal:', '629', NULL, '48-1', NULL  UNION
    SELECT 48, '31592-3','DES AXE SECO AERO 90G VICE',     5.43,NULL ,NULL  UNION
    SELECT 49, '16673-1','SAB GRANADO BEBE 250ML GLICERI', 5.5 ,NULL ,NULL  UNION
    SELECT 50, '25248-4','FR MONICA NOTURNA JUMBO MD 27',  4.26,NULL ,NULL  UNION
    SELECT 51, '29461-6','SH SEDA 350ML BRILHO GLOSS',     3.36,NULL ,NULL  UNION
    SELECT 55, 'N.Fiscal:', '630', NULL, '33-7' ,NULL  UNION
    SELECT 56, '25317-0','MIODON 200MG 30`S',   12.25, NULL, NULL  UNION
    SELECT 57, '28287-1','BIOMULTI POLIV 30`S', 13.51, NULL, NULL 
    
    --::> Cria uma tabela temporária que ira armazenar os dados tratados
    DECLARE @tbResultado TABLE 
    (
         RowNumber  TINYINT  
        ,CodProduto VARCHAR(80) NULL
        ,Descrição  VARCHAR(80) NULL
        ,Valor      MONEY       NULL
        ,Fornecedor VARCHAR(80) NULL
        ,NotaFiscal VARCHAR(80) NULL
    )
    
    --::> Váriáveis que irão receber o valor das colunas no Cursor
    DECLARE 	 
         @csRowNumber  TINYINT  
        ,@csCodProduto VARCHAR(80)
        ,@csDescrição  VARCHAR(80)
        ,@csValor      MONEY      
        ,@csFornecedor VARCHAR(80)
        ,@csNotaFiscal VARCHAR(80)
        ,@NFiscalNOVA  INT
        ,@FornecNOVA   VARCHAR(10)
    	
    DECLARE csObjeto CURSOR FAST_FORWARD 
    FOR (	  
          SELECT RowNumber, CodProduto, Descrição, Valor, Fornecedor, NotaFiscal FROM @tb
    	)
    OPEN csObjeto
    FETCH NEXT FROM csObjeto INTO @csRowNumber, @csCodProduto, @csDescrição, @csValor, @csFornecedor, @csNotaFiscal
    
    WHILE (@@FETCH_STATUS = 0) BEGIN
    	
        IF ISNUMERIC(@csDescrição) = 1 BEGIN 
            SELECT 	@NFiscalNOVA = @csDescrição, 
                    @FornecNOVA  = @csFornecedor
        END
    	
        ELSE BEGIN
            INSERT INTO @tbResultado
            SELECT @csRowNumber, @csCodProduto, @csDescrição, @csValor, @FornecNOVA, @NFiscalNOVA
        END
    
        FETCH NEXT FROM csObjeto INTO @csRowNumber, @csCodProduto, @csDescrição, @csValor, @csFornecedor, @csNotaFiscal
    END
    
    CLOSE csObjeto 
    DEALLOCATE csObjeto
    
    --::> Exibi o resultado FINAL
    SELECT * FROM @tbResultado
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Marcado como RespostaSharp.BR terça-feira, 3 de novembro de 2009 14:10
    •  
  • terça-feira, 3 de novembro de 2009 14:12Sharp.BR Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Showwwwwwwwwww....
    Funcionou, perfeitinho. Obrigadão Leonardo!!!
  • terça-feira, 3 de novembro de 2009 14:19Leonardo Marcelino Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Sharp.BR, valeu pelo retorno. 
    um abraço.
    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino