- Categorias:
PIVOT¶
Gira uma tabela transformando os valores únicos de uma coluna na expressão de entrada em várias colunas e agregando resultados onde for necessário em quaisquer valores restantes da coluna. Em uma consulta, ela é especificada na cláusula FROM após o nome da tabela ou subconsulta.
PIVOT oferece suporte às seguintes funções de agregação integradas:
PIVOT pode ser usado para transformar uma tabela estreita (por exemplo, empid, month, sales) em uma tabela mais ampla (por exemplo, empid, jan_sales, feb_sales, mar_sales).
- Consulte também:
Sintaxe¶
Parâmetros¶
aggregate_functionA função agregada para combinar os valores agrupados de
pivot_column.pivot_column [ [ AS ] alias ]A coluna da tabela de origem ou subconsulta que será agregada.
A opcional
[ AS ] aliasA cláusula especifica o alias a ser usado para o agregado no resultado da PIVOT operação. Um sublinhado e, em seguida, o alias são anexados a cada nome de coluna pivô. Por exemplo, se oaliasétotal, a operação dinâmica anexa_TOTALaos nomes das colunas dinâmicas. A palavra-chave AS é opcional.value_columnA coluna da tabela ou subconsulta de origem que contém os valores a partir dos quais os nomes das colunas serão gerados.
pivot_value_N [ [ AS ] alias ]Uma lista de valores para a coluna pivô para articular em cabeçalhos nos resultados da consulta.
A opcional
[ AS ] aliasA cláusula especifica o alias a ser usado para o valor no resultado do PIVOT operação. O alias substitui o valor.ANY [ ORDER BY ... ]Articule todos os valores distintos da coluna pivô. Para controlar a ordem das colunas dinâmicas na saída, especifique uma cláusula ORDER BY após a palavra-chave ANY. Se a coluna dinâmica contiver NULLs, então NULL também é tratado como um valor de pivô.
subqueryArticule todos os valores encontrados na subconsulta. A palavra-chave DISTINCT é necessária se a subconsulta incluir uma cláusula ORDER BY. A subconsulta deve ser uma subconsulta não correlacionada que retorne uma única coluna. O pivotamento é executado em todos os valores distintos retornados pela subconsulta. Para obter informações sobre subconsultas não correlacionadas, consulte Como trabalhar com subconsultas.
DEFAULT ON NULL(value)Substitui todos os valores de NULL no resultado dinâmico pelo valor padrão especificado. O valor padrão pode ser qualquer expressão escalar que não dependa da coluna de pivô e agregação.
Notas de uso¶
O Snowflake oferece suporte ao pivô dinâmico. Uma consulta dinâmica de pivô usa a palavra-chave ANY ou uma subconsulta na subcláusula PIVOT em vez de especificar os valores de pivô explicitamente.
Quando o pivô dinâmico é usado em uma definição de exibição, as consultas na exibição podem falhar se os dados subjacente forem alterados de forma que as colunas de saída do pivô sejam alteradas.
O pivô dinâmico não é compatível no corpo de um procedimento armazenado ou função definida pelo usuário (UDF).
Uma consulta dinâmica que não usa pivô dinâmico pode retornar saídas com colunas duplicadas. Recomendamos evitar saída com colunas duplicadas. Uma consulta de pivô desduplica colunas duplicadas.
Uma consulta dinâmica que não usa pivô dinâmico pode falhar se tentar CAST uma coluna VARIANT em um tipo de dados diferente. As consultas dinâmicas de pivô não têm essa limitação.
Atualmente, a semântica de PIVOT não permite várias agregações, mas é possível obter resultados semelhantes usando PIVOT com o operador UNION. Para obter um exemplo, consulte Pivô dinâmico com várias agregações usando UNION.
Exemplos¶
Os exemplos de PIVOT utilizam a seguinte tabela quarterly_sales:
Os exemplos a seguir usam PIVOT:
Pivô dinâmico em todos os valores distintos da coluna automaticamente
Articulação em uma lista especificada de valores de coluna para a coluna de pivô
Pivô dinâmico em todos os valores distintos da coluna automaticamente¶
Dada a tabela quarterly_sales, faça a articulação na coluna amount usando a palavra-chave ANY para somar as vendas totais por funcionário para todos os trimestres distintos e especificar ORDER BY para que as colunas do pivô fiquem em ordem:
O exemplo a seguir é o mesmo que o exemplo anterior, mas anexa o alias _TOTAL para cada nome de coluna pivô:
Pivô dinâmico em valores de coluna usando uma subconsulta¶
Suponha que, além da tabela quarterly_sales, uma tabela ad_campaign_types_by_quarter rastreie os tipos de anúncios veiculados durante trimestres específicos. Esta tabela tem a seguinte estrutura e dados:
Você pode usar uma subconsulta em uma consulta dinâmica para determinar a soma das vendas nos trimestres que tiveram campanhas publicitárias específicas. Por exemplo, a seguinte consulta de pivô retorna dados somente para trimestres com campanhas publicitárias de televisão:
Pivô dinâmico com várias agregações usando UNION¶
É possível usar o operador UNION para mostrar várias agregações em um único conjunto de resultados. Este exemplo usa o pivô dinâmico e o operador UNION para mostrar as seguintes informações de cada funcionário em cada trimestre:
O valor médio de uma venda, usando a função AVG.
A venda com o valor mais alto, usando a função MAX.
A venda com o menor valor, usando a função MIN.
O número de vendas, usando a função COUNT.
O valor total de todas as vendas, usando a função SUM.
Executar a consulta:
Pivô dinâmico com uma consulta de junção¶
Para dinamizar em uma consulta com uma junção, é possível usar uma expressão de tabela comum (CTE) para a consulta dinâmica.
Por exemplo, suponha que uma tabela simples mapeie funcionários para gerentes:
Execute uma consulta que una a tabela emp_manager e a tabela quarterly_sales e dinamize a coluna amount na tabela quarterly_sales:
Articulação em uma lista especificada de valores de coluna para a coluna de pivô¶
Dada a tabela quarterly_sales, articule a coluna amount para somar as vendas totais por funcionário nos trimestres especificados:
Você pode girar articular todos os trimestres na coluna amount executando a seguinte consulta:
Você pode modificar os nomes das colunas na saída com a cláusula AS. Por exemplo, para encurtar os nomes das colunas e mostrá-los sem aspas, execute a seguinte consulta:
Como dinamizar com um valor padrão para NULL valores¶
Se a consulta retornar valores NULL, será possível substituí-los por um valor padrão usando DEFAULT ON NULL. Por exemplo, é possível usar o pivô dinâmico e substituir os valores NULL por um valor padrão de 0 executando a seguinte consulta:
Você também pode usar DEFAULT ON NULL com uma lista de colunas especificada:
Exemplos de dinamização que envolvem várias colunas¶
As consultas dinâmicas podem trabalhar com várias colunas. Antes de executar esses exemplos, adicione uma coluna à tabela quarterly_sales e preencha a coluna com valores aleatórios.
Primeiro, adicione uma coluna que rastreie o desconto aplicado a cada venda na tabela quarterly_sales:
Preencha a nova coluna com valores aleatórios entre 0 e 5, que especificam a porcentagem de desconto para cada venda:
Consulte a tabela para mostrar a nova coluna com os valores aleatórios adicionados:
Agora que a nova coluna foi adicionada e preenchida, execute os exemplos a seguir:
Exclusão de colunas de uma consulta dinâmica com uma CTE¶
É possível usar uma expressão de tabela comum (CTE) para excluir colunas de uma consulta dinâmica.
O exemplo a seguir usa a CTE para excluir a coluna discount_percent de uma consulta dinâmica:
É possível usar uma CTE para excluir a coluna amount e mostrar o desconto médio que cada funcionário fez em cada trimestre:
Execução de uma consulta dinâmica multidimensional¶
Uma consulta dinâmica multidimensional dinamiza mais de uma coluna. Este exemplo se baseia nas colunas amount e discount_percentage. A consulta retorna a soma de todas as vendas de todos os funcionários em cada trimestre e a porcentagem máxima de desconto para todas as vendas em cada trimestre.
Na consulta, a lista SELECT usa os parâmetros $col_position para executar as funções SUM e MAX nas colunas retornadas, em ordem, e para nomear as colunas retornadas. Uma subconsulta na cláusula FROM fornece os dados para as operações dinâmicas. Como a saída mostra os resultados de vendas de todos os funcionários, a subconsulta não inclui a coluna empid.