Ce dont vous avez besoin est une requête Pivot. Étant donné que MySQL n'a pas d'instruction pour cela, vous devrez l'écrire "à la main" (plus exactement, créer une expression SQL dynamique) :
Donc, ça peut être quelque chose comme ça :
-- First you need to build the column list.
-- The "CASE ... END" expression will filter the data for each column
-- I use "max()" as an example; use whatever aggregate function you need.
select
group_concat(distinct
concat(
'max(case when del_ProductID = ', del_productID, ' then del_id end) ',
'as `del_productID-', del_productID, '` '
)
)
into @sql
from example;
-- Now build the full SELECT statement
set @sql = concat('SELECT del_date, ', @sql, ' from example group by del_date');
-- OPTIONAL: Check the SELECT statement you've just built
select @sql;
-- Prepare a statement using the SELECT statement built above
prepare stmt from @sql;
execute stmt;
-- When you are done, be sure to dealocate the prepared statement
deallocate prepare stmt;
Veuillez voir cet exemple dans SQL fiddle .
L'explication
Vous pouvez dire "mec, ça a l'air assez complexe !"... mais ce n'est pas complexe du tout (c'est juste laborieux). Alors, comment fonctionne la solution ci-dessus ?
La première étape consiste à construire la liste des colonnes et une expression pour la remplir. Le group_concat()
La fonction prendra des valeurs de ligne (ou expressions) et les concaténera, en les séparant par des virgules. Vous avez besoin d'une fonction d'agrégation pour afficher les valeurs dans le résultat du tableau croisé dynamique. J'ai choisi max()
comme exemple, mais vous pouvez utiliser sum()
, average()
ou toute autre fonction d'agrégation.
Quant au cas case ... end
pièce à l'intérieur de la fonction d'agrégation, vous avez besoin que chaque colonne du tableau croisé dynamique corresponde à la valeur de del_productID
, donc, par exemple, case when del_ProductID = 1 then del_id end
renverra la valeur de del_id
uniquement si del_ProductID
est 1 (renverra null
dans tous les autres cas, vous pouvez ajouter else 0
si vous voulez retourner zéro, par exemple).
Le select ... into
stockera le résultat de l'expression dans une variable appelée @sql
.
Après avoir construit la liste des colonnes, vous devez écrire le reste du select
instruction... c'est fait avec le concat()
fonction.
Pour le reste, c'est assez simple :@sql
est une chaîne, donc si vous voulez l'exécuter, vous devez créer une instruction préparée en utilisant sa valeur (qui est un select
instruction) et exécutez-la.