C'est essentiellement est un tableau croisé dynamique.
Un bon tutoriel sur la façon d'y parvenir peut être trouvé ici :http:// www.artfulsoftware.com/infotree/qrytip.php?id=78
Je vous conseille de lire cet article et d'adapter cette solution à vos besoins.
Mettre à jour
Une fois que le lien ci-dessus n'est plus disponible actuellement, je me sens obligé de fournir des informations supplémentaires à tous ceux qui recherchent des réponses au pivot mysql ici. Il contenait vraiment une grande quantité d'informations, et je ne mettrai pas tout à partir de là (d'autant plus que je ne veux tout simplement pas copier leurs vastes connaissances), mais je donnerai quelques conseils sur la façon de gérer pivot tableaux de la manière sql généralement avec l'exemple de peku qui a posé la question en premier lieu.
Peut-être que le lien reviendra bientôt, je garderai un œil dessus.
La méthode du tableur...
Beaucoup de gens utilisent simplement un outil comme MSExcel, OpenOffice ou d'autres tableurs à cette fin. C'est une solution valable, il suffit de copier les données là-bas et d'utiliser les outils proposés par l'interface graphique pour résoudre ce problème.
Mais... ce n'était pas la question, et cela pourrait même entraîner certains inconvénients, comme la manière d'intégrer les données dans la feuille de calcul, une mise à l'échelle problématique, etc.
La méthode SQL...
Étant donné que sa table ressemble à ceci :
CREATE TABLE `test_pivot` (
`pid` bigint(20) NOT NULL AUTO_INCREMENT,
`company_name` varchar(32) DEFAULT NULL,
`action` varchar(16) DEFAULT NULL,
`pagecount` bigint(20) DEFAULT NULL,
PRIMARY KEY (`pid`)
) ENGINE=MyISAM;
Regardez maintenant dans sa table souhaitée :
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages
-------------------------------------------------------------
CompanyA 0 0 1 3
CompanyB 1 1 2 0
Les lignes (EMAIL
, PRINT x pages
) ressemblent à des conditions. Le regroupement principal est par company_name
.
Afin de mettre en place les conditions cela crie plutôt pour utiliser le CASE
-déclaration. Pour regrouper par quelque chose, eh bien, utilisez ... GROUP BY
.
Le SQL de base fournissant ce pivot peut ressembler à ceci :
SELECT P.`company_name`,
COUNT(
CASE
WHEN P.`action`='EMAIL'
THEN 1
ELSE NULL
END
) AS 'EMAIL',
COUNT(
CASE
WHEN P.`action`='PRINT' AND P.`pagecount` = '1'
THEN P.`pagecount`
ELSE NULL
END
) AS 'PRINT 1 pages',
COUNT(
CASE
WHEN P.`action`='PRINT' AND P.`pagecount` = '2'
THEN P.`pagecount`
ELSE NULL
END
) AS 'PRINT 2 pages',
COUNT(
CASE
WHEN P.`action`='PRINT' AND P.`pagecount` = '3'
THEN P.`pagecount`
ELSE NULL
END
) AS 'PRINT 3 pages'
FROM test_pivot P
GROUP BY P.`company_name`;
Cela devrait fournir le résultat souhaité très rapidement. L'inconvénient majeur de cette approche, plus vous voulez de lignes dans votre tableau croisé dynamique, plus vous devez définir de conditions dans votre instruction SQL.
Cela peut aussi être traité, donc les gens ont tendance à utiliser des instructions préparées, des routines, des compteurs et autres.
Quelques liens supplémentaires sur ce sujet :
- http://anothermysqldba.blogspot. de/2013/06/pivot-tables-example-in-mysql.html
- http://www.codeproject. com/Articles/363339/Cross-Tabulation-Pivot-Tables-with-MySQL
- http://datacharmer.org/downloads/pivot_tables_mysql_5.pdf
- https://codingsight.com/pivot-tables-in-mysql/