Maison >base de données >tutoriel mysql >Comment faire pivoter dynamiquement des tables Oracle SQL avec des valeurs dynamiques ?

Comment faire pivoter dynamiquement des tables Oracle SQL avec des valeurs dynamiques ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-24 01:01:10382parcourir

How to Dynamically Pivot Oracle SQL Tables with Dynamic Values?

Pivot dynamique et valeur dynamique Oracle SQL

Un défi courant lors de l'utilisation de tableaux croisés dynamiques dans Oracle SQL consiste à créer des tableaux croisés dynamiques avec des valeurs dynamiques. L'approche traditionnelle consiste à ajouter manuellement de nouvelles valeurs à la chaîne statique utilisée dans l'instruction du tableau croisé dynamique IN, ce qui est inefficace.

Limitations des instructions IN dynamiques

L'intégration d'instructions dynamiques directement dans des instructions PIVOT IN à l'aide de sous-requêtes, de variables PL/SQL ou de requêtes imbriquées n'est pas prise en charge. De plus, l'utilisation de PIVOT XML peut entraîner une sortie sous-optimale.

Solution : Créer une chaîne IN dynamique

Pour surmonter ces limitations, une méthode de création de chaînes IN dynamiques peut être utilisée. Voici un guide étape par étape :

  1. Créez une instruction SELECT pour générer des chaînes dynamiques :

    • Utilisez COLUMN NEW_VALUE et LISTAGG pour concaténer les valeurs souhaitées en une seule chaîne, séparées par des virgules.
    • Stockez cette chaîne dans une variable, telle que str_in_statement.
  2. Exemple : Considérez l'exemple de tableau suivant :

<code>| myNumber | myValue | myLetter |
|---|---|---|
| 1 | 2 | A |
| 1 | 4 | B |
| 2 | 6 | C |
| 2 | 8 | A |
| 2 | 10 | B |
| 3 | 12 | C |
| 3 | 14 | A |</code>

Pour générer une chaîne IN dynamique, exécutez l'instruction suivante :

<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>
  1. Incorporer des chaînes dynamiques dans les requêtes pivot :

    • Utilisez une variable contenant une chaîne dynamique comme paramètre IN de la requête pivot.
  2. Exemple de 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>

Sortie :

<code>| MYNUMBER | A_VAL | B_VAL | C_VAL |
|---|---|---|---|
| 1 | 2 | 4 | NULL |
| 2 | 8 | 10 | 6 |
| 3 | 14 | NULL | 12 |</code>

Limitations :

Une limitation de cette méthode est que la taille maximale de chaîne pouvant être concaténée est de 4 000 octets.

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