- Catégories :
PIVOT¶
Permet de faire pivoter une table en transformant les valeurs uniques d’une colonne de l’expression d’entrée en plusieurs colonnes et en agrégeant les résultats, le cas échéant, sur les valeurs d’une colonne restante. Dans une requête, il est spécifié dans la clause FROM après le nom de la table ou la sous-requête.
L’opérateur PIVOT prend en charge les fonctions d’agrégation intégrées suivantes :
PIVOT peut être utilisé pour transformer une table étroite (par exemple empid, month, sales) en une table plus large (par exemple empid, jan_sales, feb_sales, mar_sales).
- Voir aussi :
Syntaxe¶
Paramètres¶
aggregate_functionFonction d’agrégation permettant de combiner les valeurs groupées à partir de
pivot_column.pivot_column [ [ AS ] alias ]La colonne de la table source ou de la sous-requête qui sera agrégée.
La clause
[ AS ] aliasfacultative spécifie l’alias à utiliser pour l’agrégat dans le résultat de l’opération PIVOT. Un tiret bas, puis l’alias est ajouté à chaque nom de colonne pivot. Par exemple, si l’aliasesttotal, alors l’opération pivot ajoute_TOTALaux noms des colonnes pivot. Le mot clé AS est facultatif.value_columnLa colonne de la table source ou de la sous-requête contenant les valeurs à partir desquelles les noms de colonne seront générés.
pivot_value_N [ [ AS ] alias ]Liste de valeurs permettant à la colonne pivot de pivoter dans les en-têtes des résultats de la requête.
La clause
[ AS ] aliasfacultative spécifie l’alias à utiliser pour la valeur dans le résultat de l’opération PIVOT. L’alias remplace la valeur.ANY [ ORDER BY ... ]Pivot sur toutes les valeurs distinctes de la colonne pivot. Pour contrôler l’ordre des colonnes pivot de la sortie, spécifiez une clause ORDER BY après le mot-clé ANY. Si la colonne pivot contient des valeurs NULLs, la valeur NULL est également traitée comme une valeur pivot.
subqueryPivot sur toutes les valeurs trouvées dans la sous-requête. Le mot-clé DISTINCT est obligatoire si la sous-requête inclut une clause ORDER BY. La sous-requête doit être une sous-requête non corrélée qui renvoie une seule colonne. La mise en pivot est effectuée sur toutes les valeurs distinctes renvoyées par la sous-requête. Pour des informations sur les sous-requêtes non corrélées, voir Utilisation des sous-requêtes.
DEFAULT ON NULL(value)Remplacez toutes les valeurs NULL du résultat pivot par la valeur par défaut spécifiée. La valeur par défaut peut être n’importe quelle expression scalaire qui ne dépend pas du pivot ni de la colonne d’agrégation.
Notes sur l’utilisation¶
Snowflake prend en charge le pivot dynamique. Une requête pivot dynamique utilise le mot-clé ANY ou une sous-requête dans la sous-clause PIVOT au lieu de spécifier explicitement les valeurs pivot.
Lorsque le pivot dynamique est utilisé dans une définition de vue, les requêtes sur la vue peuvent échouer si les données sous-jacentes changent de sorte que les colonnes de sortie du pivot sont modifiées.
Le pivot dynamique n’est pas pris en charge dans le corps d’une procédure stockée ou d’une fonction définie par l’utilisateur (UDF).
Une requête pivot qui n’utilise pas de pivot dynamique peut renvoyer une sortie avec des colonnes en double. Nous vous recommandons d’éviter les sorties avec des colonnes en double. Une requête pivot dynamique dédoublonne les colonnes en double.
Une requête pivot qui n’utilise pas de pivot dynamique risque d’échouer si elle tente d’appliquer une opération CAST à une colonne VARIANT pour la convertir en un autre type de données. Les requêtes pivot dynamiques n’ont pas cette limitation.
Actuellement, la sémantique PIVOT n’autorise pas les agrégations multiples, mais vous pouvez obtenir des résultats similaires en utilisant PIVOT avec l’opérateur UNION. Pour un exemple, voir Pivot dynamique avec agrégations multiples à l’aide de l’opérateur UNION.
Exemples¶
Les exemples de PIVOT utilisent la table quarterly_sales suivante :
L’exemple suivant utilise PIVOT :
Pivot dynamique sur toutes les valeurs de colonne distinctes automatiquement
Pivot dynamique sur les valeurs de colonne à l’aide d’une sous-requête
Pivot dynamique avec agrégations multiples à l’aide de l’opérateur UNION
Pivot sur une liste spécifiée de valeurs de colonne pour la colonne pivot
Pivot dynamique sur toutes les valeurs de colonne distinctes automatiquement¶
Dans la table quarterly_sales, appliquez un pivot sur la colonne amount à l’aide du mot-clé ANY pour additionner les ventes totales par employé pour tous les trimestres distincts, et spécifiez ORDER BY pour que les colonnes pivot soient dans l’ordre :
L’exemple suivant est le même que l’exemple précédent, mais il ajoute l’alias _TOTAL à chaque nom de colonne pivot :
Pivot dynamique sur les valeurs de colonne à l’aide d’une sous-requête¶
Supposez qu’en plus de la table quarterly_sales, une table ad_campaign_types_by_quarter suive les types de publicités diffusées au cours de certains trimestres. Cette table présente la structure et les données suivantes :
Vous pouvez utiliser une sous-requête dans une requête pivot pour déterminer la somme des ventes des trimestres qui ont fait l’objet de campagnes publicitaires spécifiques. Par exemple, la requête pivot suivante renvoie les données uniquement pour les trimestres ayant fait l’objet de campagnes publicitaires à la télévision :
Pivot dynamique avec agrégations multiples à l’aide de l’opérateur UNION¶
Vous pouvez utiliser l’opérateur UNION pour afficher plusieurs agrégations dans un seul jeu de résultats. Cet exemple utilise le pivot dynamique et l’opérateur UNION pour afficher les informations suivantes pour chaque employé et chaque trimestre :
Le montant moyen d’une vente, en utilisant la fonction AVG.
La vente dont la valeur est la plus élevée, en utilisant la fonction MAX.
La vente dont la valeur est la plus basse, en utilisant la fonction MIN.
Le nombre de ventes, en utilisant la fonction COUNT.
Le montant total de toutes les ventes, en utilisant la fonction SUM.
Exécutez la requête :
Pivot dynamique avec une requête de jointure¶
Pour pivoter dans une requête avec jointure, vous pouvez utiliser une expression de table commune (CTE) pour la requête pivot.
Par exemple, supposons qu’une table simple mappe les employés aux gestionnaires :
Exécuter une requête qui joint la table emp_manager et la table quarterly_sales et qui pivote sur la colonne amount de la table quarterly_sales :
Pivot sur une liste spécifiée de valeurs de colonne pour la colonne pivot¶
Dans la table quarterly_sales, appliquez un pivot sur la colonne amount pour additionner les ventes totales par employé pour les trimestres spécifiés :
Vous pouvez appliquer un pivot sur tous les trimestres de la colonne amount en exécutant la requête suivante :
Vous pouvez modifier les noms de colonne de la sortie à l’aide de la clause AS. Par exemple, pour raccourcir les noms de colonne et les afficher sans guillemets, exécutez la requête suivante :
Pivot avec une valeur par défaut pour les valeurs NULL¶
Si la requête renvoie des valeurs NULL, vous pouvez les remplacer par une valeur par défaut en utilisant DEFAULT ON NULL. Par exemple, vous pouvez utiliser le pivot dynamique et remplacer les valeurs NULL par une valeur par défaut 0 en exécutant la requête suivante :
Vous pouvez également utiliser DEFAULT ON NULL avec une liste de colonnes spécifiée :
Exemples de pivots qui impliquent plusieurs colonnes¶
Les requêtes pivot peuvent fonctionner avec plusieurs colonnes. Avant d’exécuter ces exemples, ajoutez une colonne à la table quarterly_sales et remplissez la colonne avec des valeurs aléatoires.
Tout d’abord, ajoutez à la table quarterly_sales une colonne qui suit la remise appliquée à chaque vente :
Remplir la nouvelle colonne avec des valeurs aléatoires comprises entre 0 et 5, qui indiquent le pourcentage de remise pour chaque vente :
Interroger la table pour afficher la nouvelle colonne avec les valeurs aléatoires ajoutées :
Maintenant que la nouvelle colonne est ajoutée et remplie, exécutez les exemples suivants :
Exclure des colonnes d’une requête pivot à l’aide de l’expression CTE¶
Vous pouvez utiliser une expression de table commune (CTE) pour exclure des colonnes d’une requête pivot.
L’exemple suivant utilise l’expression CTE pour exclure la colonne discount_percent d’une requête pivot :
Vous pouvez utiliser l’expression CTE pour exclure la colonne amount et afficher la remise moyenne accordée par chaque employé au cours de chaque trimestre :
Exécuter une requête pivot multidimensionnelle¶
Une requête pivot multidimensionnelle pivote sur plus d’une colonne. Cet exemple pivote sur la colonne amount et la colonne discount_percentage. La requête renvoie la somme de toutes les ventes réalisées par tous les employés chaque trimestre et le pourcentage de remise maximum pour toutes les ventes chaque trimestre.
Dans la requête, la liste SELECT utilise les paramètres $col_position pour exécuter les fonctions SUM et MAX sur les colonnes renvoyées dans l’ordre, et pour nommer les colonnes renvoyées. Une sous-requête dans la clause FROM fournit les données pour les opérations de pivot. Comme la sortie affiche les résultats des ventes pour tous les employés, la sous-requête n’inclut pas la colonne empid.