Maison > Questions et réponses > le corps du texte
P粉6968918712023-08-23 00:33:40
Ma solution est d'utiliser T-SQL sans aucun pivot :
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粉6086470332023-08-23 00:17:57
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 d'adapter cette solution à vos besoins.
Mise à jour
Étant donné que le lien ci-dessus n'est actuellement plus disponible, je me sens obligé de fournir ici des informations supplémentaires à tous ceux qui recherchent des réponses aux tableaux croisés dynamiques MySQL. Il contient une tonne d'informations, et je ne copierai pas tout ici (sans parler du fait que je ne veux pas copier leurs vastes connaissances), mais je donnerai quelques conseils sur la façon de travailler avec des tableaux croisés dynamiques à l'aide de SQL, et d'abord Exemple de peku qui a posé la question.
Peut-être que le lien reviendra bientôt, je garderai un œil ouvert.
Méthode tableur...
Beaucoup de gens utilisent simplement des tableurs comme MSExcel, OpenOffice ou autres à cette fin. 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 certaines lacunes, comme la manière d'importer des données dans des feuilles de calcul, des problèmes d'évolutivité, etc.
Façon SQL...
Supposons que sa montre 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;
Jetez maintenant un œil au tableau de ce qu'il attend :
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages ------------------------------------------------------------- CompanyA 0 0 1 3 CompanyB 1 1 2 0
ligne (EMAIL
,PRINT x pages
)表示条件。主要的分组是按company_name
réalisée.
Afin de définir des conditions, il est plus approprié d'utiliser l'instruction CASE
CASE
语句。为了按某个东西进行分组,使用...GROUP BY
. Pour regrouper par quelque chose, utilisez...GROUP BY
.
Le 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 avez besoin de lignes dans le tableau croisé dynamique, plus vous devez définir de conditions dans l'instruction SQL.
Cela peut également être résolu, c'est pourquoi les gens ont tendance à utiliser des instructions préparées, des routines, des compteurs, etc.
Quelques liens supplémentaires sur ce sujet :