Maison > Questions et réponses > le corps du texte
P粉1542284832023-08-22 11:20:30
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粉3669463802023-08-22 00:09:42
Il s’agit essentiellement d’un tableau croisé dynamique.
Le tutoriel détaillé sur la façon d'implémenter cette fonction peut être trouvé ici : http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Je vous recommande de lire cet article et d'adapter la solution à vos 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. Il contient beaucoup 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 suggestions sur la façon de travailler avec des tableaux croisés dynamiques dans SQL, à The la question soulevée par peku en est un exemple.
Peut-être que le lien sera bientôt rétabli, je continuerai à le suivre.
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 conduire à certaines lacunes, comme la façon d'importer des données dans des feuilles de calcul, des problèmes de mise à l'échelle, 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;
Maintenant, regardez la montre qu'il/elle veut :
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages ------------------------------------------------------------- CompanyA 0 0 1 3 CompanyB 1 1 2 0
行(EMAIL
, PRINT x pages
)表示条件。主要分组是按company_name
réalisé.
Pour définir des conditions, cela revient plutôt à 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 peut être 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 fournir les résultats souhaités très rapidement. Le principal inconvénient de cette approche est que vous devez définir davantage de conditions dans l'instruction SQL lorsque vous souhaitez avoir plus de lignes dans le tableau croisé dynamique.
Cela peut également être géré, de sorte que les gens ont tendance à utiliser des déclarations préparées, des routines, des compteurs, etc.
Quelques liens supplémentaires sur ce sujet :