Transformar conteúdo de linha em coluna

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
xprata
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 93
Registrado em: Ter, 06 Abr 2010 11:31 am
Localização: São Paulo - SP

Boas senhores, tenho o resultado de uma query onde gostaria de transformar o conteúdo da coluna em novas colunas. No exemplo abaixo, gostaria de transformar a coluna grupo em colunas (grupo1,grupo2...)
Consigo fazer isso sem criar tabela temporário e SPs?

Data Grupo Item Total
01/07/2017 Grupo 1 prego 1
01/07/2017 Grupo 2 parafuso 5
01/07/2017 Grupo 2 pacote 1 6
02/07/2017 Grupo 1 Pacote 2 8
02/07/2017 Grupo 2 parafuso 6
02/07/2017 Grupo 2 local 4
02/07/2017 Grupo 3 pacote 1 8
03/07/2017 Grupo 1 parafuso 12
03/07/2017 Grupo 4 local 12
Renato Menezes Viana
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Sáb, 18 Nov 2006 11:51 am
Localização: Rio de Janeiro - RJ

DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá,

Caso você esteja usando versão anterior a 11(onde foi inclusa a função PIVOT e UNPIVOT), você pode fazer da seguinte forma:

Selecionar tudo

WITH MYSQL AS (
SELECT '01/07/2017' DT_X, 'Grupo 1' GRUPO, 'prego'     ITEM ,1     QTDE FROM DUAL UNION ALL
SELECT '01/07/2017' DT_X, 'Grupo 2' GRUPO, 'parafuso'   ITEM ,5     QTDE FROM DUAL UNION ALL
SELECT '01/07/2017' DT_X, 'Grupo 2' GRUPO, 'pacote 1'   ITEM ,6     QTDE FROM DUAL UNION ALL
SELECT '02/07/2017' DT_X, 'Grupo 1' GRUPO, 'pacote 2'   ITEM ,8     QTDE FROM DUAL UNION ALL
SELECT '02/07/2017' DT_X, 'Grupo 2' GRUPO, 'parafuso'   ITEM ,6     QTDE FROM DUAL UNION ALL
SELECT '02/07/2017' DT_X, 'Grupo 2' GRUPO, 'local'     ITEM ,4     QTDE FROM DUAL UNION ALL
SELECT '02/07/2017' DT_X, 'Grupo 3' GRUPO, 'pacote 1' 	ITEM ,8     QTDE FROM DUAL UNION ALL
SELECT '03/07/2017' DT_X, 'Grupo 1' GRUPO, 'parafuso' 	ITEM ,12    QTDE FROM DUAL UNION ALL
SELECT '03/07/2017' DT_X, 'Grupo 4' GRUPO, 'local' 		ITEM ,12    QTDE FROM DUAL)

SELECT M.DT_X
     , M.ITEM
     , SUM(CASE WHEN M.GRUPO = 'Grupo 1' THEN M.QTDE ELSE 0 END) GRUPO1
     , SUM(CASE WHEN M.GRUPO = 'Grupo 2' THEN M.QTDE ELSE 0 END) GRUPO2
     , SUM(CASE WHEN M.GRUPO = 'Grupo 3' THEN M.QTDE ELSE 0 END) GRUPO3
     , SUM(CASE WHEN M.GRUPO = 'Grupo 4' THEN M.QTDE ELSE 0 END) GRUPO4     
  FROM MYSQL M
 GROUP BY M.DT_X
     , M.ITEM
OBS: Considerando que o valor que você quer agrupar em cada grupo seja a quantidade dos itens.
OBS2: Você precisa especificar manualmente cada grupo que existe.
xprata
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 93
Registrado em: Ter, 06 Abr 2010 11:31 am
Localização: São Paulo - SP

Senhores obrigado pelo retorno...
As duas formas apresentadas funcionaram...
Obrigado
att
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 17 visitantes