Il s'agit essentiellement d' un tableau croisé dynamique.
Un joli didacticiel 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
Après que le lien ci-dessus ne soit plus disponible actuellement, je me sens obligé de fournir des informations supplémentaires pour vous tous à la recherche de réponses de pivot mysql ici. Il avait vraiment une grande quantité d'informations, et je ne mettrai pas tout à partir d'ici (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 le pivot tables 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 manière tableur ...
De nombreuses personnes utilisent simplement un outil comme MSExcel, OpenOffice ou d'autres outils de tableur à cet effet. C'est une solution valide, copiez simplement les données là-bas et utilisez 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 des inconvénients, comme la façon de placer les données dans la feuille de calcul, une mise à l'échelle problématique, etc.
La manière 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;
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 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 l'utilisation de la CASE
déclaration. Pour groupe par quelque chose, eh bien, l' utilisation ... 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 également être traité, par conséquent, les gens ont tendance à utiliser des instructions, des routines, des compteurs et autres.
Quelques liens supplémentaires sur ce sujet: