Aprenda PL/SQL

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
  

Mensagemem Ter, 14 Nov 2017 10:30 am

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
xprata
Localização: São Paulo - SP

Mensagemem Qua, 15 Nov 2017 1:44 pm

Renato Menezes Viana
Localização: Rio de Janeiro - RJ

Mensagemem Qui, 16 Nov 2017 11:48 am

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:

Código: Selecionar todos
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.
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Qui, 16 Nov 2017 12:21 pm

Senhores obrigado pelo retorno...
As duas formas apresentadas funcionaram...
Obrigado
att
xprata
Localização: São Paulo - SP



Voltar para PL/SQL

Quem está online

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