Maison >base de données >tutoriel mysql >Comment puis-je faire pivoter un tableau sans utiliser de fonctions d'agrégation ?

Comment puis-je faire pivoter un tableau sans utiliser de fonctions d'agrégation ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-20 09:47:08420parcourir

How Can I Pivot a Table Without Using Aggregate Functions?

Conversion de données de tableau croisé dynamique sans fonctions d'agrégation

Dans le domaine du traitement des données, il est parfois nécessaire de remodeler les données dans un format plus convivial ou plus pratique pour l'analyse. L’une des techniques les plus courantes pour y parvenir est le pivotement, où les données sont transformées dans une présentation plus large. Bien que le pivotement implique généralement des valeurs agrégées, il peut également être effectué sans utiliser de fonctions d’agrégation.

Considérez le tableau suivant :

<code class="language-sql">CREATE TABLE Data (
  CustomerID int,
  DBColumnName varchar(50),
  Data varchar(50)
);

INSERT INTO Data (CustomerID, DBColumnName, Data)
VALUES
  (1, 'FirstName', 'Joe'),
  (1, 'MiddleName', 'S'),
  (1, 'LastName', 'Smith'),
  (1, 'Date', '12/12/2009'),
  (2, 'FirstName', 'Sam'),
  (2, 'MiddleName', 'S'),
  (2, 'LastName', 'Freddrick'),
  (2, 'Date', '1/12/2009'),
  (3, 'FirstName', 'Jaime'),
  (3, 'MiddleName', 'S'),
  (3, 'LastName', 'Carol'),
  (3, 'Date', '12/1/2009');</code>

Ce tableau contient des données pour plusieurs clients, où chaque enregistrement représente un attribut spécifique (FirstName, MiddleName, LastName, Date) et sa valeur associée. L'objectif est de faire pivoter ces données dans un format plus lisible :

<code class="language-sql">CREATE TABLE PivotedData (
  CustomerID int,
  FirstName varchar(50),
  MiddleName varchar(50),
  LastName varchar(50),
  Date varchar(50)
);

INSERT INTO PivotedData (CustomerID, FirstName, MiddleName, LastName, Date)
VALUES
  (1, 'Joe', 'S', 'Smith', '12/12/2009'),
  (2, 'Sam', 'S', 'Freddrick', '1/12/2009'),
  (3, 'Jaime', 'S', 'Carol', '12/1/2009');</code>

Il est important de noter que cette transformation n'agrège pas les données. Au lieu de cela, il conserve une valeur unique pour chaque attribut de chaque client.

Pour réaliser cette transformation sans utiliser de fonctions d'agrégation, nous pouvons utiliser une expression CASE dans une instruction SELECT groupée :

<code class="language-sql">SELECT
  CustomerID,
  MIN(CASE DBColumnName WHEN 'FirstName' THEN Data END) AS FirstName,
  MIN(CASE DBColumnName WHEN 'MiddleName' THEN Data END) AS MiddleName,
  MIN(CASE DBColumnName WHEN 'LastName' THEN Data END) AS LastName,
  MIN(CASE DBColumnName WHEN 'Date' THEN Data END) AS Date
FROM Data
GROUP BY CustomerID;</code>

Cette requête utilise une série d'expressions CASE pour sélectionner conditionnellement la valeur associée à chaque attribut pour chaque client. La fonction MIN() est utilisée pour récupérer une valeur unique qui répond à une condition spécifiée, garantissant que nous ne contenons qu'une seule valeur par attribut. En regroupant les résultats par CustomerID, nous créons une ligne pour chaque client avec ses attributs et valeurs correspondants.

Cette technique permet un pivotement flexible des données sans utiliser de fonctions d'agrégation. Ceci est particulièrement utile lorsque les données nécessitent une transformation minimale et que les valeurs d'origine doivent être préservées.

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