Comment faire un tableau croisé dynamique avec MySQL
Publié le 26 Mai 2011
Autant être clair dès le début, cette fonctionnalité n'est pas (encore) présente dans MySQL.
Mais heureusement avec une requête SQL bien sentie un peu obtenir un résultat similaire.
Je vais partir d'une table qui contient les mêmes données que dans mon article concernant les tableaux croisés dynamique sous Excel à savoir:
Table ventes
mois | client | montant |
---|---|---|
janvier | M.A. | 2045 |
janvier | M.A. | 123 |
janvier | B.H. | 1034 |
janvier | N.S. | 765 |
janvier | C.G. | 34 |
janvier | E.B. | 983 |
fevrier | M.A. | 678 |
fevrier | B.H. | 1254 |
fevrier | N.S. | 98 |
fevrier | C.G. | 459 |
fevrier | E.B. | 2451 |
février | S.R. | 34 |
mars | B.H. | 763 |
mars | C.G. | 896 |
mars | E.B. | 1439 |
mars | S.R. | 2392 |
mars | S.R. | 25 |
et le but est d'arriver au même résultat que sous excel:
+--------+---------+---------+------+
| client | janvier | fevrier | mars |
+--------+---------+---------+------+
| B.H | 1034 | 1254 | 763 |
| C.G | 34 | 459 | 896 |
| E.B | 983 | 2451 | 1439 |
| M.A | 2168 | 678 | 0 |
| N.S | 765 | 98 | 0 |
| S.R | 0 | 34 | 2417 |
+--------+---------+---------+------+
et pour y arriver voici la requête magique:
SELECT
client,
SUM(IF(mois = 'janvier', montant, 0)) AS janvier,
SUM(IF(mois = 'fevrier', montant, 0)) AS fevrier,
SUM(IF(mois = 'mars', montant, 0)) AS mars
FROM ventes
GROUP BY client;
Et oui grâce aux instructions IF on compte les ventes par mois (ce qui nous donne les différentes colonnes) et le GROUP BY permet de compter par client, ce qui nous donne bien le même résultat que sous Excel.