locked
Pivot com mais de uma coluna. RRS feed

  • Pergunta

  • Estou precisando fazer um Pivot, já li vários exemplos aqui mas não conseguir encaixar um neste exemplo :

    Tabela Original:

    Name Caixas  Litros

    PRODUTO_A 10.00 13.00

    PRODUTO_B 22.00 33.00  

     

    Pivot(Objetivo):

    Name PRODUTO_A PRODUTO_B

    Caixas 10.00 22.00

    Litros 13.00 33.00

     

     

    Obrigado

     

     

     

     

    quarta-feira, 23 de novembro de 2011 11:58

Respostas

  • Nomade,

    Estou a um tempão aqui batendo cabeça e cheguei em uma conclusão (não tenho certeza de que minha conclusão está correta). Você está querendo que na primeira coluna apresente a primeira linha com um campo específico da tabela teste e a segunda linha com outra coluna. Essa lógica está confusa. Pelo que eu vi não é possível fazer isso. Eu conseguir demonstrar o que você solicitou mudando a estrutura da tabela. Foi a única maneira que eu encontrei. Dê uma olhada:

    --Tabela
    CREATE TABLE [dbo].[Teste](
     id int identity(1,1),
     [SecondName] [nvarchar](50) NULL,
     [tipo] varchar(100) null,
     [quantidade] [numeric](18, 2) NULL
     ) ON [PRIMARY]
    GO
    ---Dados
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_a'
               ,'Report_CX'
               ,'88')
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_b'
               ,'Report_CX'
               ,'33')
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_a'
               ,'Report_Litros'
               ,'64')
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_b'
               ,'Report_Litros'
               ,'34')
    -- Select padrão
    SELECT [id]
          ,[SecondName]
          ,[tipo]
          ,[quantidade]
      FROM [teste].[dbo].[Teste]
    -- Query modificada
    SELECT
    -- <non-pivoted column>,
    -- valores - cabeçalho da primeira coluna
    [tipo] as 'tipo',
    --[pivoted column] AS <column name>,
    -- Linhas da primeira coluna
    [PRODUTO_A],
    [PRODUTO_b]
    FROM
    -- Select principal no qual você deseja converter
    (SELECT [id]
          ,[SecondName]
          ,[tipo]
          ,[quantidade]
      FROM [teste].[dbo].[Teste]) p
    PIVOT
    (
    -- <aggregation function>(<column being aggregated>)
    -- Agregação
    sum(quantidade)
    -- [<column that contains the values that will become column headers>]
    -- Coluna que contem os valores que serão os cabeçalho
    FOR [SecondName] IN
    ( [PRODUTO_A], [PRODUTO_b] )
    ) AS pvt

    Veja se com isso você consegue resolver o seu problema. Na minha opinião, não tem como fazer isso que você está precisando com o pivot.

     


    Guilherme Costa - Engenheiro de Software
    Email: guilerme18@hotmail.com

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    A ideia do pivot é transformar linha em coluna e coluna em linha. Não vai dar para colocar na mesma coluna uma linha começando com um campo e a outra linha começando com outro campo. Concorda ?

    Guilherme Costa - Engenheiro de Software
    Email: guilerme18@hotmail.com

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta Nomade quarta-feira, 23 de novembro de 2011 18:18
    quarta-feira, 23 de novembro de 2011 18:04

Todas as Respostas

  • Vou te dar um exemplo utilizando o PIVOT que eu precisei utilizar no meu trabalho. Vou colocar abaixo a query de exemplo da criação da tabela, como seria a query inicial e a query modificada:

    -- Criando a tabela

    USE [teste]
    GO

    /****** Object: Table [dbo].[vendas] Script Date: 11/23/2011 09:07:47 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    CREATE TABLE [dbo].[vendas](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [orcamento] [varchar](50) NULL,
    [data] [datetime] NULL,
    [valor] [decimal](18, 4) NULL
    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO

    -- Query incial
    SELECT month([data]) as Mes,sum([valor]) AS Total
    FROM [teste].[dbo].[vendas]
    group by month([data])

    -- Query modificada
    SELECT 'Total' AS Mes,
    [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]
    FROM
    (SELECT month([data]) as Mes,([valor]) AS Total
    FROM [teste].[dbo].[vendas]) AS SourceTable
    PIVOT
    (
    SUM(Total)
    FOR Mes IN ([1] , [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
    ) AS PivotTable


    Guilherme Costa - Engenheiro de Sofware
    Email: guilerme18@hotmail.com

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 23 de novembro de 2011 12:03
  • Olá Guilherme, é quase isto, imagina que usarmos sua coluna orcamento  como sendo produto e invertermos estas linhas em colunas.

    vlw

    quarta-feira, 23 de novembro de 2011 12:29
  • Conseguiu adptar o meu exemplo com a sua necessidade ? Se não, me avise qual foi o problema, coloque a query que você criou para que eu possa ajudá-lo a corrigir.


    Guilherme Costa - Engenheiro de Sofware
    Email: guilerme18@hotmail.com

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 23 de novembro de 2011 15:18
  • Legal Guilherme,

    Preciso inverter linha coluna, segue tabela simplificada:

     

    --Tabela

    CREATE TABLE [dbo].[Teste](

    [SecondName] [nvarchar](50) NULL,

    [Report_CX] [numeric](18, 2) NULL,

    [Report_Litros] [numeric](18, 2) NULL

    ) ON [PRIMARY]

     

    GO

    ---Dados

    INSERT INTO [dbo].[Teste]

               ([SecondName]

               ,[Report_CX]

               ,[Report_Litros])

         VALUES

               ('PRODUTO_A',10,20)

     

      INSERT INTO [dbo].[Teste]

               ([SecondName]

               ,[Report_CX]

               ,[Report_Litros])

         VALUES

               ('PRODUTO_B',33,66)

    quarta-feira, 23 de novembro de 2011 15:41
  • Nomade,

    Estou a um tempão aqui batendo cabeça e cheguei em uma conclusão (não tenho certeza de que minha conclusão está correta). Você está querendo que na primeira coluna apresente a primeira linha com um campo específico da tabela teste e a segunda linha com outra coluna. Essa lógica está confusa. Pelo que eu vi não é possível fazer isso. Eu conseguir demonstrar o que você solicitou mudando a estrutura da tabela. Foi a única maneira que eu encontrei. Dê uma olhada:

    --Tabela
    CREATE TABLE [dbo].[Teste](
     id int identity(1,1),
     [SecondName] [nvarchar](50) NULL,
     [tipo] varchar(100) null,
     [quantidade] [numeric](18, 2) NULL
     ) ON [PRIMARY]
    GO
    ---Dados
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_a'
               ,'Report_CX'
               ,'88')
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_b'
               ,'Report_CX'
               ,'33')
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_a'
               ,'Report_Litros'
               ,'64')
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_b'
               ,'Report_Litros'
               ,'34')
    -- Select padrão
    SELECT [id]
          ,[SecondName]
          ,[tipo]
          ,[quantidade]
      FROM [teste].[dbo].[Teste]
    -- Query modificada
    SELECT
    -- <non-pivoted column>,
    -- valores - cabeçalho da primeira coluna
    [tipo] as 'tipo',
    --[pivoted column] AS <column name>,
    -- Linhas da primeira coluna
    [PRODUTO_A],
    [PRODUTO_b]
    FROM
    -- Select principal no qual você deseja converter
    (SELECT [id]
          ,[SecondName]
          ,[tipo]
          ,[quantidade]
      FROM [teste].[dbo].[Teste]) p
    PIVOT
    (
    -- <aggregation function>(<column being aggregated>)
    -- Agregação
    sum(quantidade)
    -- [<column that contains the values that will become column headers>]
    -- Coluna que contem os valores que serão os cabeçalho
    FOR [SecondName] IN
    ( [PRODUTO_A], [PRODUTO_b] )
    ) AS pvt

    Veja se com isso você consegue resolver o seu problema. Na minha opinião, não tem como fazer isso que você está precisando com o pivot.

     


    Guilherme Costa - Engenheiro de Software
    Email: guilerme18@hotmail.com

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 23 de novembro de 2011 18:01
  • Nomade,

    Estou a um tempão aqui batendo cabeça e cheguei em uma conclusão (não tenho certeza de que minha conclusão está correta). Você está querendo que na primeira coluna apresente a primeira linha com um campo específico da tabela teste e a segunda linha com outra coluna. Essa lógica está confusa. Pelo que eu vi não é possível fazer isso. Eu conseguir demonstrar o que você solicitou mudando a estrutura da tabela. Foi a única maneira que eu encontrei. Dê uma olhada:

    --Tabela
    CREATE TABLE [dbo].[Teste](
     id int identity(1,1),
     [SecondName] [nvarchar](50) NULL,
     [tipo] varchar(100) null,
     [quantidade] [numeric](18, 2) NULL
     ) ON [PRIMARY]
    GO
    ---Dados
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_a'
               ,'Report_CX'
               ,'88')
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_b'
               ,'Report_CX'
               ,'33')
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_a'
               ,'Report_Litros'
               ,'64')
    INSERT INTO [teste].[dbo].[Teste]
               ([SecondName]
               ,[tipo]
               ,[quantidade])
         VALUES
               ('produto_b'
               ,'Report_Litros'
               ,'34')
    -- Select padrão
    SELECT [id]
          ,[SecondName]
          ,[tipo]
          ,[quantidade]
      FROM [teste].[dbo].[Teste]
    -- Query modificada
    SELECT
    -- <non-pivoted column>,
    -- valores - cabeçalho da primeira coluna
    [tipo] as 'tipo',
    --[pivoted column] AS <column name>,
    -- Linhas da primeira coluna
    [PRODUTO_A],
    [PRODUTO_b]
    FROM
    -- Select principal no qual você deseja converter
    (SELECT [id]
          ,[SecondName]
          ,[tipo]
          ,[quantidade]
      FROM [teste].[dbo].[Teste]) p
    PIVOT
    (
    -- <aggregation function>(<column being aggregated>)
    -- Agregação
    sum(quantidade)
    -- [<column that contains the values that will become column headers>]
    -- Coluna que contem os valores que serão os cabeçalho
    FOR [SecondName] IN
    ( [PRODUTO_A], [PRODUTO_b] )
    ) AS pvt

    Veja se com isso você consegue resolver o seu problema. Na minha opinião, não tem como fazer isso que você está precisando com o pivot.

     


    Guilherme Costa - Engenheiro de Software
    Email: guilerme18@hotmail.com

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    A ideia do pivot é transformar linha em coluna e coluna em linha. Não vai dar para colocar na mesma coluna uma linha começando com um campo e a outra linha começando com outro campo. Concorda ?

    Guilherme Costa - Engenheiro de Software
    Email: guilerme18@hotmail.com

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta Nomade quarta-feira, 23 de novembro de 2011 18:18
    quarta-feira, 23 de novembro de 2011 18:04
  • Faz sentido, Já ajudou bastate , Obrigado ! (Ponto Posito, rs)
    quarta-feira, 23 de novembro de 2011 18:18