Maison > Questions et réponses > le corps du texte
P粉3688781762023-08-24 17:12:04
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粉3842444732023-08-24 14:49:27
Il s’agit essentiellement d’un tableau croisé dynamique.
Un bon tutoriel 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
Après que le lien ci-dessus n'est actuellement plus disponible, j'ai ressenti le besoin de fournir des informations supplémentaires à tous ceux qui recherchent ici des réponses au hub MySQL. Il contient une tonne d'informations, je ne les mettrai pas toutes ici (ni même plus, car je ne veux tout simplement pas reproduire leurs vastes connaissances), mais je donnerai quelques conseils sur la façon de gérer les pivots en général. dans le tableau des méthodes SQL, en prenant comme exemple le peku qui a posé la question en premier.
Peut-être que le lien reviendra bientôt, je garderai un œil ouvert.
Méthode tableur...
De nombreuses personnes utilisent simplement MSExcel, OpenOffice ou d'autres outils de feuille de calcul à 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 un problème, cela peut même entraîner certains inconvénients comme la façon d'introduire les données dans la feuille de calcul, des problèmes de mise à l'échelle, etc.
Façon SQL...
Étant donné que son formulaire 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;
Voir le formulaire qu'il souhaite maintenant :
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages ------------------------------------------------------------- CompanyA 0 0 1 3 CompanyB 1 1 2 0
OK (电子邮件
、打印 x 页
)类似于条件。主要分组是按company_name
.
Pour définir des conditions, vous devez utiliser la déclaration <代码>CASE. Pour regrouper par quelque chose, utilisez...GROUP BY
GROUP BY
.
Le SQL de base pour fournir ce pivot 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 de lignes dans le tableau croisé dynamique, plus vous devez définir de conditions dans l'instruction SQL.
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 autres liens sur ce sujet :