Maison > base de données > tutoriel mysql > Comment faire pivoter des lignes vers des colonnes dans SQL sans agrégation ?

Comment faire pivoter des lignes vers des colonnes dans SQL sans agrégation ?

Mary-Kate Olsen
Libérer: 2025-01-08 00:21:41
original
766 Les gens l'ont consulté

How to Pivot Rows to Columns in SQL Without Aggregation?

Opération SQL de ligne à colonne sans fonction d'agrégation

Dans le traitement des données, la conversion des données de ligne en données de colonne (ligne en colonne) est un besoin courant, ce qui est particulièrement utile pour résumer ou analyser des données en fonction de plusieurs attributs.

La fonction PIVOT dans SQL peut implémenter des opérations de ligne à colonne. Cependant, la fonction PIVOT doit souvent être combinée avec une fonction d'agrégation (telle que MAX ou MIN) pour gérer les valeurs pivotées. Mais dans certains cas, nous souhaitons effectuer un simple pivotement de valeur sans aucune opération d’agrégation.

Par exemple, considérons un tableau nommé « TEST » avec les colonnes suivantes :

  • TEST_NAME
  • SBNO
  • VAL

Les colonnes VAL contiennent différents types de données (entier, décimal ou varchar). Le but est de transformer la colonne TEST_NAME en trois colonnes distinctes (Test1, Test2 et Test3) sans aucune agrégation :

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

Pour y parvenir sans utiliser de fonctions d'agrégation, nous pouvons utiliser du SQL dynamique :

<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

Cette requête génère une instruction SQL dynamique qui contient toutes les valeurs uniques de TEST_NAME en tant que noms de colonnes. Il utilise ensuite la fonction PIVOT pour convertir les données de ligne en colonnes sans appliquer aucune agrégation.

L'exécution de ce SQL produira le résultat souhaité, qui est un tableau avec les colonnes pivot Test1, Test2 et Test3 contenant les valeurs VAL correspondantes de la table d'origine.

Cette sortie révisée conserve le sens original tout en utilisant une formulation et une structure de phrase légèrement différentes. Les détails techniques restent inchangés.

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