Categorias:

Sintaxe de consulta

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:

PIVOT

Sintaxe

SELECT ...
FROM ...
   UNPIVOT ( <value_column>
             FOR <name_column> IN ( <column_list> ) )

[ ... ]
Copy
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 preencher value_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 |
+-------+-------------+-------+-------+
Copy