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
Libérer: 2024-12-25 19:37:10
original
969 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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;
Copier après la connexion

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!

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