Maison > Questions et réponses > le corps du texte
P粉4615998452023-07-26 12:06:35
Ma solution consiste à utiliser T-SQL au lieu de n'importe quel tableau croisé dynamique :
SELECT CompanyName, SUM(CASE WHEN (action='EMAIL') THEN 1 ELSE 0 END) AS Email, SUM(CASE WHEN (action='PRINT' AND pagecount=1) THEN 1 ELSE 0 END) AS Print1Pages, SUM(CASE WHEN (action='PRINT' AND pagecount=2) THEN 1 ELSE 0 END) AS Print2Pages, SUM(CASE WHEN (action='PRINT' AND pagecount=3) THEN 1 ELSE 0 END) AS Print3Pages FROM Company GROUP BY CompanyName
P粉5742689892023-07-26 00:37:24
Il s’agit essentiellement d’un tableau croisé dynamique.
Un tutoriel détaillé sur la façon de mettre en œuvre cela peut être trouvé ici : http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Je vous recommande de lire cet article et de l'adapter à vos propres besoins.
MISE À JOUR
Étant donné que le lien ci-dessus n'est actuellement plus disponible, j'ai ressenti le besoin de fournir ici des informations supplémentaires à tous ceux qui recherchent des réponses aux tableaux croisés dynamiques MySQL. Ce lien contient vraiment beaucoup d'informations, je ne vais pas tout copier (et je ne veux pas copier leur richesse de connaissances), mais je vais donner quelques conseils sur la façon de travailler avec des tableaux croisés dynamiques en SQL, avec peku Prenons la question posée comme exemple.
Peut-être que le lien sera bientôt rétabli, je garderai un œil dessus.
La méthode des feuilles de calcul...
Beaucoup de gens utilisent simplement des outils comme MSExcel, OpenOffice ou d'autres outils de feuilles de calcul pour accomplir cette tâche. C'est une solution valable, copiez simplement les données là-bas et utilisez les outils fournis par l'interface graphique pour résoudre le problème.
Mais... ce n'est pas le nœud du problème, et peut même entraîner certains inconvénients, comme la façon d'importer des données dans des feuilles de calcul, des problèmes d'évolutivité, etc.
Façon SQL...
Supposons 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 le tableau des attentes :
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages ------------------------------------------------------------- CompanyA 0 0 1 3 CompanyB 1 1 2 0
La ligne (EMAIL, imprimer x pages) est comme une condition. Le regroupement principal se fait par nom d'entreprise.
Afin de définir des conditions, il est plus approprié d'utiliser l'instruction CASE. Pour regrouper par quelque chose, vous pouvez utiliser GROUP BY.
Une instruction SQL de base pour fournir ce tableau croisé dynamique pourrait 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 les résultats souhaités très rapidement. Le principal inconvénient de cette approche est que plus vous souhaitez avoir de lignes dans le tableau croisé dynamique, plus vous devez définir de conditions dans l'instruction SQL.
Ce problème peut également être résolu, c'est pourquoi les gens ont tendance à utiliser des instructions préparées, des routines, des compteurs, etc.
Voici quelques liens supplémentaires sur ce sujet :