Mysql
 sql >> Base de données >  >> RDS >> Mysql

requête pour la disposition horizontale des données mysql

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.