Maison >base de données >tutoriel mysql >Comment effectuer des pivots dynamiques dans Oracle SQL avec des valeurs variables ?

Comment effectuer des pivots dynamiques dans Oracle SQL avec des valeurs variables ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-24 00:57:10736parcourir

How to Perform Dynamic Pivots in Oracle SQL with Varying Values?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn