Usuário com melhor resposta
Pivot com mais de uma coluna.

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 pvtVeja 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.comSe 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.comSe 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
GOSET QUOTED_IDENTIFIER ON
GOSET ANSI_PADDING ON
GOCREATE 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 PivotTableGuilherme Costa - Engenheiro de Sofware
Email: guilerme18@hotmail.comSe 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.- Sugerido como Resposta Guilherme Costa - Campinas - SP quarta-feira, 23 de novembro de 2011 15:19
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.comSe 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 pvtVeja 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.comSe 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 pvtVeja 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.comSe 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.comSe 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