locked
Agrupar coluna RRS feed

  • Pergunta

  •  

    Tenho o seguinte tabela

     

    PLACAS     COD

    XNL2165      000001
    XOC6407     000001
    XRD6350     000001
    XOS1243     000002
    XRE9028     000002
    XAP3138     000003
    XNO8086     000003
    XOF4093     000003

     

    UM CODIGO POSSUI VARIAS PLACAS E GOSTARIA DE COLOCAR ISSO POR LINHA

     

    COD      PLACA1   PLACA2    PLACA3

    000001  XNL2165   XOC6407    XRD6350

     

    FAZENDO ISSO COM TODAS AS LINHAS DA TABELA.

     

    GOSTARIA DA AJUDA DE ALGUEM PARA RESOLVER ESSE PROBLEMA.

     

     

    OBRIAGADO          

    segunda-feira, 11 de fevereiro de 2008 19:26

Todas as Respostas

  • Anderson,

     

    O que você esta querendo fazer seria um Pivot, ou seja, fazer com que as linhas da sua table se tornem colunas.

     

    Veja se estes exemplos poderá ajudar:

    Code Snippet

     

    Create table #Exemplo (codigo int, nome varchar(10))

    insert into #Exemplo (codigo, nome) Values (1,'jose')

    insert into #Exemplo (codigo, nome) Values (2,'mario')

    insert into #Exemplo (codigo, nome) Values (1,'jose')

    insert into #Exemplo (codigo, nome) Values (2,'mario')

    insert into #Exemplo (codigo, nome) Values (3,'celso')

    insert into #Exemplo (codigo, nome) Values (4,'andre')

     

    Select [jose],[mario],[celso],[andre] from #exemplo

    Pivot (count(codigo) for nome in ([jose],[mario],[celso],[andre])) p

     

     

    terça-feira, 12 de fevereiro de 2008 15:52
    Moderador
  • Anderson, demorou um pouco mais saiu o código.

     

    Segue abaixo:

     

     

    Code Snippet

    SET NOCOUNT ON;

    CREATE TABLE #Placas (placa varchar(10), cod numeric(6,0))

    CREATE TABLE #Placa(cod numeric(6,0))

    CREATE TABLE #TmpPlacas (RowId int Identity(1,1), cod numeric (6,0), placa varchar(10), nreg int)

    DECLARE @nr int, @i int

    DECLARE @cmd varchar(1000)

    DECLARE @ini int, @fim int, @j int, @nreg int, @cod int

    DECLARE @placa varchar(10)--, @cmd varchar(1000)

     

     

    INSERT INTO #Placas

    VALUES ('XNL2165', 000001)

    INSERT INTO #Placas

    VALUES ('XOC6407', 000001)

    INSERT INTO #Placas

    VALUES('XRD6350', 000001)

    INSERT INTO #Placas

    VALUES('XOS1243', 000002)

    INSERT INTO #Placas

    VALUES('XRE9028', 000002)

    INSERT INTO #Placas

    VALUES('XAP3138', '000003')

    INSERT INTO #Placas

    VALUES('XNO8086', 000003)

    INSERT INTO #Placas

    VALUES('XOF4093', 000003)

    --CREATE TABLE #Placa(cod numeric(6,0))

    --DECLARE @nr int, @i int

    --DECLARE @cmd varchar(1000)

    Select @nr = Max(tb1.cod) From (Select count(cod) as cod

    From #Placas

    Group By cod) As tb1

    Set @i = 1

    WHILE @i <= @nr

    BEGIN

    SET @cmd = 'ALTER TABLE #Placa ADD Placa' + cast(@i as varchar) + ' varchar(10)'

    EXEC (@cmd)

    SET @i = @i + 1

    END

    Insert #Placa (cod) Select Distinct cod From #Placas

    --DECLARE @ini int, @fim int, @j int, @nreg int, @cod int

    --DECLARE @placa varchar(10)--, @cmd varchar(1000)

    Insert Into #TmpPlacas Select cod, placa,

    (Select Count(cod) From #Placas a Where a.cod = b.cod Group By Cod) nreg

    From #Placas b

    Order By cod;

    Select @fim = Max(RowId) From #TmpPlacas

    Set @ini = 1

    Set @j = 1

    WHILE (@ini <= @fim)

    BEGIN

    Select @nreg = nreg, @placa = placa, @cod = cod From #TmpPlacas Where RowId = @ini

    If (@j <= @nreg)

    Begin

    Set @cmd = 'UPDATE #Placa SET Placa' + cast(@j as varchar) + ' = ' + '''' + @placa + '''' +

    ' WHERE cod = ' + cast(@cod as varchar)

    EXEC (@cmd)

    Set @j = @j + 1

    If (@j > @nreg)

    Set @j = 1

    End

    Set @ini = @ini + 1

    END

    Select * From #Placa

    --Select * From #Placas

    --Select * From #TmpPlacas

    --Truncate Table #TmpPlacas

    Drop Table #Placas

    Drop Table #Placa

    Drop Table #TmpPlacas

     

     

    Espero que seja isso....

     

    No SQL 2000 o processo é um pouco complicado mesmo.

     

    Abraços,

     

     

     

    terça-feira, 12 de fevereiro de 2008 19:39