none
Transformar linha de Cabeçalho em Coluna com CURSOR SQL SERVER RRS feed

  • Pergunta

  • Prezados,

    Tenho uma tabela com a  seguinte estrutura:

    Reg  l Dados

    I200 l 2000,00      

    I250 l 500,00 D

    I250 l 1500,00 D

    I250 l 2000,00 C

    I200 l 300,00

    I250 l 300,00 D

    I250 l 100,00 C

    I250 l 100,00 C

    I250 l 100,00 C

    ...

    E quero transforma-la na tabela seguinte:

    Dados l Dados II

    2000,00 l 500,00 D

    2000,00 l 1500,00 D

    2000,00 l 2000,00 C

    300,00 l 300,00 D

    300,00 l 100,00 C

    300,00 l 100,00 C

    300,00 l 100,00 C

    Estou usando o cursor abaixo, mas o resultando que tenho obtido não é o esperado:

    DECLARE @I200 VARCHAR(1000),

    DECLARE CR_I200 CURSOR FOR

    SELECT [Dados] FROM Tabela WHERE [Reg]='I200'

    OPEN CR_I200
    FETCH NEXT FROM CR_I200 INTO @I200
    WHILE @@FETCH_STATUS=0
    BEGIN
    INSERT INTO TabelaII (I200,I250)
    SELECT @I200, [Dados] FROM Tabela WHERE [Reg]='I250'
    END

    CLOSE CR_I200
    DEALLOCATE CR_I200

    Favor, ajudar!

    quarta-feira, 11 de julho de 2012 17:08

Respostas

  • Funcionou da seguinte forma, mas vcs conhecem algo mais rápido?

    DECLARE @REG VARCHAR(4),
            @DADOS VARCHAR(1000),
            @I200 VARCHAR(1000),
            @I250 VARCHAR(1000)

    -- Cursor para percorrer os nomes dos objetos
    DECLARE CR_REG2 CURSOR FOR
        SELECT [Coluna 1],[Coluna 2]
        FROM Tabela
        WHERE [Coluna 1]='I200' OR [Coluna 1]='I250'

    -- Abrindo Cursor para leitura
    OPEN CR_REG2

    -- Lendo a próxima linha
    FETCH NEXT FROM CR_REG2 INTO @REG,@DADOS

    -- Percorrendo linhas do cursor (enquanto houverem)
    WHILE @@FETCH_STATUS = 0 AND (@REG='I200' OR @REG='I250')
    BEGIN
    IF @REG='I200'
    BEGIN
    SET @I200=@DADOS
    END
    ELSE
    BEGIN
    SET @I250=@DADOS
        INSERT INTO TESTE(I200,I250)
        SELECT @I200,@I250
    END
        -- Lendo a próxima linha
    FETCH NEXT FROM CR_REG2 INTO @REG,@DADOS
    END
    -- Fechando Cursor para leitura
    CLOSE CR_REG2
    -- Desalocando o cursor
    DEALLOCATE CR_REG2

    • Marcado como Resposta Alexpps sexta-feira, 13 de julho de 2012 13:48
    sexta-feira, 13 de julho de 2012 13:48

Todas as Respostas

  • Alex, boa tarde.

    Primeiramente preciso saber o que liga um crédito "C" com um débito "D". Qual a lógica para associação dos dois valores numa mesma linha. Existe um campo que associa os dois valoreS?

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    quarta-feira, 11 de julho de 2012 17:46
  • O que liga é o Registro I200 que está logo acima:

    Reg  l Dados

    I200 l 2000,00      

    I250 l 500,00 D

    I250 l 1500,00 D

    I250 l 2000,00 C


    sexta-feira, 13 de julho de 2012 11:08
  • Funcionou da seguinte forma, mas vcs conhecem algo mais rápido?

    DECLARE @REG VARCHAR(4),
            @DADOS VARCHAR(1000),
            @I200 VARCHAR(1000),
            @I250 VARCHAR(1000)

    -- Cursor para percorrer os nomes dos objetos
    DECLARE CR_REG2 CURSOR FOR
        SELECT [Coluna 1],[Coluna 2]
        FROM Tabela
        WHERE [Coluna 1]='I200' OR [Coluna 1]='I250'

    -- Abrindo Cursor para leitura
    OPEN CR_REG2

    -- Lendo a próxima linha
    FETCH NEXT FROM CR_REG2 INTO @REG,@DADOS

    -- Percorrendo linhas do cursor (enquanto houverem)
    WHILE @@FETCH_STATUS = 0 AND (@REG='I200' OR @REG='I250')
    BEGIN
    IF @REG='I200'
    BEGIN
    SET @I200=@DADOS
    END
    ELSE
    BEGIN
    SET @I250=@DADOS
        INSERT INTO TESTE(I200,I250)
        SELECT @I200,@I250
    END
        -- Lendo a próxima linha
    FETCH NEXT FROM CR_REG2 INTO @REG,@DADOS
    END
    -- Fechando Cursor para leitura
    CLOSE CR_REG2
    -- Desalocando o cursor
    DEALLOCATE CR_REG2

    • Marcado como Resposta Alexpps sexta-feira, 13 de julho de 2012 13:48
    sexta-feira, 13 de julho de 2012 13:48