En SQL, les données peuvent souvent être structurées avec des lignes représentant des enregistrements individuels et des colonnes contenant des attributs spécifiques. Cependant, il existe des situations où il devient nécessaire de transformer des lignes en colonnes, processus appelé transposition. Dans cet article, nous allons explorer une solution pour transposer des lignes en colonnes à l'aide de PostgreSQL.
Considérez le scénario suivant : vous disposez de deux tables, l'une avec des réponses aux questions et l'autre contenant les vraies questions. L'objectif est de transposer les données afin que chaque utilisateur dispose d'une ligne représentant ses réponses à toutes les questions.
responses: user_id | question_id | body ---------------------------- 1 | 1 | Yes 2 | 1 | Yes 1 | 2 | Yes 2 | 2 | No 1 | 3 | No 2 | 3 | No questions: id | body ------------------------- 1 | Do you like apples? 2 | Do you like oranges? 3 | Do you like carrots?
Le résultat souhaité ressemblerait à ceci :
user_id | Do you like apples? | Do you like oranges? | Do you like carrots? --------------------------------------------------------------------------- 1 | Yes | Yes | No 2 | Yes | No | No
Pour transposer les données, nous utiliserons une combinaison de JOIN et MAX() avec une expression CASE. La requête est la suivante :
SELECT r.user_id, MAX(CASE WHEN r.question_id = 1 THEN r.body ELSE NULL END) AS "Do you like apples?", MAX(CASE WHEN r.question_id = 2 THEN r.body ELSE NULL END) AS "Do you like oranges?", MAX(CASE WHEN r.question_id = 3 THEN r.body ELSE NULL END) AS "Do you like carrots?" FROM RESPONSES r JOIN QUESTIONS q ON q.id = r.question_id GROUP BY r.user_id
1. JOIN : L'opération JOIN établit une relation entre les tables RESPONSES et QUESTIONS basées sur la colonne commune question_id. Cela nous permet d'associer les réponses aux questions correspondantes.
2. MAX() avec CASE : La fonction MAX() est utilisée pour agréger la colonne du corps, en considérant uniquement la valeur maximale pour chaque combinaison utilisateur et question. L'expression CASE dans MAX() agit comme une instruction conditionnelle qui récupère la valeur du corps d'une question spécifique ou NULL si la condition n'est pas remplie.
3. GROUP BY : La clause GROUP BY regroupe les résultats par colonne user_id. Cela garantit que chaque ligne de la sortie représente un utilisateur unique.
La requête SQL fournie transpose efficacement les lignes en colonnes, vous permettant d'extraire facilement les réponses des utilisateurs pour un ensemble de questions. Cette technique est communément appelée données pivotantes et est souvent utilisée dans l’analyse et la création de rapports de données. En utilisant les constructions JOIN, MAX() et CASE aux côtés de GROUP BY, vous pouvez réaliser de puissantes transformations de données en SQL.
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!