Maison >base de données >tutoriel mysql >Comment effectuer des pivots dynamiques dans Oracle SQL avec des valeurs variables ?
Tableau croisé dynamique Oracle SQL : gérer les valeurs changeantes
La gestion des valeurs dynamiques dans les instructions IN
peut être délicate lors de l'utilisation de la fonction PIVOT dans Oracle SQL. Cet article apporte une solution.
PIVOT d'Oracle nécessite généralement l'utilisation de chaînes de valeurs statiques dans l'instruction IN
, par exemple :
<code class="language-sql">... pivot (sum(A) for B in (X)) </code>
Cependant, si la valeur de B est stockée dans une colonne de base de données et mise à jour régulièrement, la mise à jour manuelle de la chaîne X devient peu pratique.
Pour résoudre ce problème, nous pouvons utiliser une astuce qui consiste à créer une chaîne IN
puis à l'utiliser dans la requête PIVOT. Décomposons-le :
Étape 1 : Construire la chaîne IN
Pour créer une chaîne, on utilise les fonctions COLUMN NEW_VALUE
et LISTAGG
comme suit :
<code class="language-sql">COLUMN temp_in_statement new_value str_in_statement SELECT DISTINCT LISTAGG('''' || myLetter || ''' AS ' || myLetter,',') WITHIN GROUP (ORDER BY myLetter) AS temp_in_statement FROM (SELECT DISTINCT myLetter FROM myTable);</code>
Cette requête crée une chaîne similaire à :
<code>'A' AS A,'B' AS B,'C' AS C</code>
Étape 2 : Utiliser des chaînes dans PIVOT
Nous pouvons maintenant ajouter cette chaîne à notre requête PIVOT :
<code class="language-sql">SELECT * FROM (SELECT myNumber, myLetter, myValue FROM myTable) PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));</code>
Restrictions :
Bien que cette méthode apporte une solution, elle présente une limitation : la longueur maximale de la chaîne de connexion est de 4 000 octets. Par conséquent, cette méthode peut ne pas convenir si le nombre de valeurs de B est très grand.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!