En gros, cela es un tableau croisé dynamique.
Vous trouverez ici un bon tutoriel sur la manière d'y parvenir : http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Je vous conseille de lire ce post et d'adapter cette solution à vos besoins.
Mise à jour
Après le lien ci-dessus n'est actuellement plus disponible, je me sens obligé de fournir quelques informations supplémentaires pour tous ceux qui cherchent des réponses mysql pivot ici. Il y avait vraiment une grande quantité d'informations, et je ne vais pas mettre tout ce qu'il y a là-dedans (même plus puisque je ne veux pas copier leur vaste connaissance), mais je vais donner quelques conseils sur la façon de traiter les tableaux croisés dynamiques à 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 sur lui.
La méthode du tableur...
De nombreuses personnes 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 que l'interface graphique offre 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'introduire les données dans le tableur, une mise à l'échelle problématique, etc.
La méthode SQL...
Étant donné que sa table ressemble à quelque chose comme ça :
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;
Maintenant, regardez dans sa table désirée :
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages
-------------------------------------------------------------
CompanyA 0 0 1 3
CompanyB 1 1 2 0
Les rangées ( EMAIL
, PRINT x pages
) ressemblent à des conditions. Le principal regroupement se fait par company_name
.
Afin de mettre en place les conditions nécessaires, il convient d'utiliser l'outil d'évaluation de la qualité de l'eau. CASE
-... déclaration. Pour regrouper par quelque chose, eh bien, utilisez ... GROUP BY
.
Le SQL de base fournissant ce pivot peut ressembler à quelque chose comme 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 permettre d'obtenir le résultat souhaité très rapidement. L'inconvénient majeur de cette approche est que plus vous voulez de lignes dans votre tableau croisé dynamique, plus vous devez définir de conditions dans votre instruction SQL.
Ce problème peut également être résolu, c'est pourquoi les gens ont tendance à utiliser des déclarations préparées, des routines, des compteurs, etc.
Quelques liens supplémentaires sur ce sujet :
5 votes
C'est ce qu'on appelle le pivotement et il est beaucoup, beaucoup plus rapide d'effectuer cette transformation en dehors de SQL.
1 votes
Excel déchire les choses comme ça, c'est vraiment difficile en MySQL car il n'y a pas d'opérateur "CROSSTAB" :(
0 votes
Oui, c'est actuellement fait à la main dans Excel et nous essayons de l'automatiser.
3 votes
J'ai trouvé ici un exemple étape par étape : comment automatiser les tableaux croisés dynamiques . et este
0 votes
@N.B. Est-il conseillé de l'effectuer dans notre couche d'application ou est-il plus simple de le faire là ?
1 votes
@giannischristofakis - cela dépend vraiment de ce que vous et vos collègues jugez plus simple. La technologie a beaucoup évolué depuis que j'ai posté ce commentaire (4 ans). C'est donc à vous de décider ce qui vous semble le mieux, que ce soit dans l'application ou en SQL. Par exemple, à mon travail, nous traitons un problème similaire, mais nous combinons à la fois l'approche SQL et l'approche in-app. En fait, je ne peux pas vous aider autrement qu'en vous donnant une opinion et ce n'est pas ce dont vous avez besoin :)
0 votes
Une procédure stockée pour générer le code Pivot (et l'exécuter) : mysql.rjweb.org/doc.php/pivot