Maison > base de données > tutoriel mysql > Comment effectuer un pivotement dynamique dans SQL sans agrégation ?

Comment effectuer un pivotement dynamique dans SQL sans agrégation ?

Susan Sarandon
Libérer: 2025-01-07 22:51:44
original
995 Les gens l'ont consulté

How to Perform Dynamic Pivoting in SQL Without Aggregation?

Pivot dynamique : transformez intelligemment les lignes en colonnes

Les instructions SQL dynamiques sont des outils puissants pour créer des requêtes flexibles. Cet article se concentrera sur la conversion de lignes en colonnes sans utiliser de fonctions d'agrégation.

Comprendre la perspective dynamique

Les opérations pivot utilisent généralement des fonctions d'agrégation telles que SUM ou MAX. Cependant, dans certains cas, il est souhaitable d’obtenir directement la perspective de la valeur. Cela nécessite une approche légèrement différente.

Par exemple, considérons le tableau source suivant :

<code>╔═══════════╦══════╦═══════╗
║ TEST_NAME ║ SBNO ║  VAL  ║
╠═══════════╬══════╬═══════╣
║ Test1     ║    1 ║ 0.304 ║
║ Test1     ║    2 ║ 0.31  ║
║ Test1     ║    3 ║ 0.306 ║
║ Test2     ║    1 ║ 2.3   ║
║ Test2     ║    2 ║ 2.5   ║
║ Test2     ║    3 ║ 2.4   ║
║ Test3     ║    1 ║ PASS  ║
║ Test3     ║    2 ║ PASS  ║
╚═══════════╩══════╩═══════╝</code>
Copier après la connexion

Le résultat souhaité est un tableau croisé dynamique similaire au suivant :

<code>╔══════════════════════════╗
║ SBNO Test1 Test2   Test3 ║
╠══════════════════════════╣
║ 1    0.304  2.3    PASS  ║
║ 2    0.31   2.5    PASS  ║
║ 3    0.306  2.4    NULL  ║
╚══════════════════════════╝</code>
Copier après la connexion

Pivotement dynamique sans fonctions d'agrégation

Pour obtenir ce résultat sans utiliser de fonctions d'agrégation, nous pouvons utiliser la fonction PIVOT. Étant donné que la colonne VAL contient des données varchar, nous pouvons utiliser la fonction d'agrégation MAX.

Perspective codée en dur

Pour un nombre limité de tests, nous pouvons coder en dur les noms de colonnes comme suit :

<code class="language-sql">select sbno, Test1, Test2, Test3
from
(
  select test_name, sbno, val
  from yourtable
) d
pivot
(
  max(val)
  for test_name in (Test1, Test2, Test3)
) piv;</code>
Copier après la connexion

Perspective dynamique évolutive

Pour de gros volumes de tests, Dynamic SQL fournit une solution évolutive :

<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT sbno,' + @cols + '
             from 
             (
                select test_name, sbno, val
                from yourtable
            ) x
            pivot 
            (
                max(val)
                for test_name in (' + @cols + ')
            ) p '

execute(@query)</code>
Copier après la connexion

Les deux méthodes produiront le même résultat souhaité. Cet exemple montre comment tirer parti du SQL dynamique pour créer une solution flexible et efficace permettant de résoudre des tâches de traitement de données complexes.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal