Maison >base de données >tutoriel mysql >Comment faire pivoter les données des colonnes d'une table MySQL en lignes ?

Comment faire pivoter les données des colonnes d'une table MySQL en lignes ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-25 19:37:10969parcourir

How to Pivot MySQL Table Column Data into Rows?

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!

Déclaration:
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