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>
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>
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>
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>
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!