Transposition de lignes en colonnes dans DB2 à l'aide de Dynamic SQL
L'objectif est de faire pivoter les données d'un tableau, en convertissant les lignes en colonnes, pour obtenir un résultat souhaité. Considérez la structure de table suivante :
Table source
ItemID | Item | Value |
---|---|---|
1 | Meeting | Now |
1 | Advise | Yes |
1 | NoAdvise | No |
2 | Meeting | Never |
2 | Advise | No |
2 | NoAdvise | Null |
2 | Combine | Yes |
Sortie souhaitée
ItemID | Meeting | Advise | NoAdvise |
---|---|---|---|
1 | Now | Yes | No |
2 | Never | No | Null |
SQL Requête à l'aide de sous-requêtes corrélées
Une approche pour réaliser cette transformation consiste à utiliser sous-requêtes corrélées :
SELECT A.ItemID, MAX(CASE WHEN A.Item = 'Meeting' THEN Value END) AS Meeting, MAX(CASE WHEN A.Item = 'Advise' THEN Value END) AS Advise, MAX(CASE WHEN A.Item = 'NoAdvise' THEN Value END) AS NoAdvise FROM A GROUP BY A.ItemID
Cette requête exécute plusieurs sous-requêtes corrélées, une pour chaque colonne de sortie souhaitée, pour extraire la valeur correspondante pour chaque ligne. Les résultats sont ensuite regroupés par colonne ItemID pour obtenir la sortie pivotée.
Approche alternative utilisant Dynamic SQL
Une autre option consiste à exploiter le SQL dynamique pour construire un tableau croisé dynamique. . Cette approche permet plus de flexibilité et peut être personnalisée pour générer les colonnes de sortie souhaitées :
DECLARE @cols AS NVARCHAR(MAX), @sql AS NVARCHAR(MAX) SET @cols = '' SELECT @cols += ',MAX(CASE WHEN Item = ''' + Item + ''' THEN Value END) AS ' + Item FROM ( SELECT DISTINCT Item FROM A ) AS Items SET @sql = 'SELECT ItemID, ' + SUBSTRING(@cols, 2) + ' FROM A GROUP BY ItemID' EXEC (@sql)
Cette requête construit dynamiquement l'instruction SQL en fonction des valeurs distinctes de la colonne Item et l'exécute, générant la sortie pivotée. .
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!