none
Trocar Colunas por Registros.... Pivot RRS feed

  • Pergunta

  •  

    Prezados, alguem tem algum exemplo de como retornar colunas como registros e vice-versa?

    Não sei se usando Pivot resolveria.

    Alguem tem algum exemplo de como usar essa função?

     

    Atc,

    quarta-feira, 26 de março de 2008 16:28

Todas as Respostas

  •  

    seu sql e 2005 ? veja no books on line a funcao pivot e unpivot tem exemplo bons la.

     

    Abs;

    quarta-feira, 26 de março de 2008 16:35
  • Esqueci de falar, é SQL 2000.
    Tem a mesma função?
    quarta-feira, 26 de março de 2008 16:37
  • Adriano,

     

    A principio um Pivot poderia resolver sim.

     

    Veja se este exemplo ajuda, mas teste no SQL Server 2005.

     

    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

     

     

    quarta-feira, 26 de março de 2008 16:41
  • Ok Junior,

    Vou tentar ajustar a minha necessidade.
    Muito Obrigado!
    quarta-feira, 26 de março de 2008 16:43
  • Adriano,

     

    No SQL Server 2000 não.

    quarta-feira, 26 de março de 2008 16:44
  • no 2000 da um pouco de trabalho ou vc. usa case em subquery  ( aproveitando o exemplo do junior )

     

    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')

     

     Select sum([jose]) As Jose, sum([mario]) As mario , sum([celso]) As Celso
    From (
    Select [jose] = Case when nome = 'jose' then codigo else 0 End,
           [mario] = Case when nome = 'mario' then codigo else 0 End,
           [celso] = Case when nome = 'celso' then codigo else 0 End
    From #Exemplo) DrvTbl

     

    mais se for dinamico ou seja vc. nao sabe quantas colunas vai ter e mais chato de fazer exemplo:

     

    -- Esta funcao e para retornar somente o dia 01 de todos os meses
    CREATE FUNCTION fn_RBMS_ReturnMonth (@Vdata as Datetime)
    RETURNS DateTime
    AS
    BEGIN
    return cast(Str(month(@Vdata)) + '/01/'+ ltrim(Str(year(@Vdata))) as SMALLDateTime)
    END
    -- -- Cria uma Tabela de Exemplo
    Create Table #Dados (Idx int identity(1,1), Valor Numeric (19,2), Data DateTime)
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-01-01')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-02-01')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-04-01')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-05-01')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-01-02')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-05-07')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-01-08')

    Create Table #PivotTabela (CampoChave Int)
    Insert into #PivotTabela (CampoChave) Values (1) -- So para criar uma linha em branco
    Declare @DataI Datetime -- Sao Variaveis para fazer o loop
    Declare @DataF Datetime --
    Select @DataI = Dbo.fn_RBMS_ReturnMonth(Min(Data)), @DataF = Dbo.fn_RBMS_ReturnMonth(Max(Data))
    From #Dados

    -- Alimenta com a menor e a maior data para definir o range
    Declare @TotalMes Numeric(19,2)
    Declare @StringDDL Varchar(1000)
    While @DataI <= @DataF
    Begin
    Select @TotalMes = Sum(Valor) From #Dados
    Where Dbo.fn_RBMS_ReturnMonth(Data) = @DataI
    If @TotalMes > 0
    Begin
    Set @StringDDL = 'Alter Table #PivotTabela Add [' + Right(Convert(Char(10),@DataI,105),7) + '] Numeric(19,2) '
    Exec(@StringDDL)
    Set @StringDDL = 'Update #PivotTabela Set [' + Right(Convert(Char(10),@DataI,105),7) + '] = ' + convert(varchar(30),@Totalmes)
    Exec(@StringDDL)
    Set @TotalMes = 0
    End
    Set @DataI = DateAdd(m,1, @DataI)
    End

    Select * From #PivotTabela

     

     

    qq retorne.

    quarta-feira, 26 de março de 2008 16:47