- Categorias:
UNPIVOT¶
Gira uma tabela transformando colunas em linhas. UNPIVOT é um operador relacional que aceita duas colunas (de uma tabela ou subconsulta), juntamente com uma lista de colunas, e gera uma linha para cada coluna especificada na lista. Em uma consulta, ela é especificada na cláusula FROM após o nome da tabela ou subconsulta.
Note que UNPIVOT não é exatamente o contrário de PIVOT, pois não pode desfazer as agregações feitas por PIVOT.
Este operador pode ser usado para transformar uma tabela larga (por exemplo, empid
, jan_sales
, feb_sales
, mar_sales
) em uma tabela mais estreita (por exemplo, empid
, month
, sales
).
- Consulte também:
Sintaxe¶
SELECT ...
FROM ...
UNPIVOT ( <value_column>
FOR <name_column> IN ( <column_list> ) )
[ ... ]
value_column
O nome a ser atribuído à coluna gerada que será preenchida com os valores das colunas da lista de colunas.
name_column
O nome a ser atribuído à coluna gerada que será preenchida com os nomes das colunas na lista de colunas.
column_list
Os nomes das colunas na tabela ou subconsulta de origem que serão estreitados em uma única coluna pivô. Os nomes das colunas irão preencher
name_column
, e os valores das colunas irão preenchervalue_column
.A
column_list
deve conter apenas nomes literais de colunas, não uma subconsulta.
Exemplos¶
Considerando uma tabela, monthly_sales
, com a seguinte estrutura e dados, desarticule as colunas individuais do mês para retornar um único valor sales
por month
para cada funcionário:
-- example setup CREATE OR REPLACE TABLE monthly_sales(empid INT, dept TEXT, jan INT, feb INT, mar INT, april INT); INSERT INTO monthly_sales VALUES (1, 'electronics', 100, 200, 300, 100), (2, 'clothes', 100, 300, 150, 200), (3, 'cars', 200, 400, 100, 50); -- UNPIVOT example SELECT * FROM monthly_sales UNPIVOT(sales FOR month IN (jan, feb, mar, april)) ORDER BY empid; +-------+-------------+-------+-------+ | EMPID | DEPT | MONTH | SALES | |-------+-------------+-------+-------| | 1 | electronics | JAN | 100 | | 1 | electronics | FEB | 200 | | 1 | electronics | MAR | 300 | | 1 | electronics | APRIL | 100 | | 2 | clothes | JAN | 100 | | 2 | clothes | FEB | 300 | | 2 | clothes | MAR | 150 | | 2 | clothes | APRIL | 200 | | 3 | cars | JAN | 200 | | 3 | cars | FEB | 400 | | 3 | cars | MAR | 100 | | 3 | cars | APRIL | 50 | +-------+-------------+-------+-------+