Maison >base de données >tutoriel mysql >Comment faire pivoter les données des colonnes d'une table MySQL en lignes ?
Données de colonne de tableau croisé dynamique MySQL sous forme de lignes
Pour les données de colonne de tableau croisé dynamique sous forme de lignes dans MySQL, vous pouvez utiliser une combinaison de MAX( ) et les fonctions CASE avec une clause GROUP BY. Voici la syntaxe générale :
SELECT GROUP_BY_COLUMNS, MAX(CASE WHEN condition1 THEN column1 END) AS column1_alias, MAX(CASE WHEN condition2 THEN column2 END) AS column2_alias, ... FROM TABLE GROUP BY GROUP_BY_COLUMNS
Dans l'exemple fourni, vous disposez de trois tableaux : Question, qui contient les questions du questionnaire ; Résultats, qui relient les utilisateurs aux emplois ; et Réponses, qui contient les réponses des utilisateurs aux questions.
Pour faire pivoter les réponses aux questions sous forme de colonnes pour chaque ensemble de résultats, vous pouvez utiliser la requête suivante :
SELECT a.ID, a.user_ID, a.job_id, MAX(CASE WHEN c.question = 'Is it this?' THEN b.answer END) 'Is it this?', MAX(CASE WHEN c.question = 'Or this?' THEN b.answer END) 'Or this?', MAX(CASE WHEN c.question = 'Or that? ' THEN b.answer END) 'Or that? ' FROM Results a INNER JOIN Answers b ON a.id = b.fk_result_id INNER JOIN Question c ON b.fk_question_id = c.ID GROUP BY a.ID, a.user_ID, a.job_id
Cette requête combine les Table de réponses avec la table de questions basée sur le champ fk_question_id et la table de résultats basée sur le champ fk_result_id. Il regroupe ensuite les résultats par colonnes ID, user_ID et job_id, et pour chaque groupe, il calcule la réponse maximale pour chaque question à l'aide de la fonction MAX() et de l'instruction CASE.
Alternativement, si vous avez un nombre inconnu de questions, vous pouvez utiliser une requête SQL dynamique qui construit la chaîne de requête en fonction des questions disponibles :
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(CASE WHEN c.question = ''', question, ''' then b.answer end) AS ', CONCAT('`',question,'`') ) ) INTO @sql FROM Question; SET @sql = CONCAT('SELECT a.ID, a.user_ID, a.job_id, ', @sql, ' FROM Results a INNER JOIN Answers b ON a.id = b.fk_result_id INNER JOIN Question c ON b.fk_question_id = c.ID GROUP BY a.ID, a.user_ID, a.job_id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
La requête dynamique construit la variable @sql avec les éléments nécessaires colonnes pour chaque question et l'exécute sous forme d'instruction préparée.
Ces requêtes renverront les réponses aux questions sous forme de colonnes pour chaque ensemble de résultats, vous permettant de les afficher dans un format convivial.
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!