Comment implémenter la sortie du tableau croisé dynamique dans MySQL
P粉481035232
P粉481035232 2023-08-21 16:06:24
0
2
506
<p>Si j'ai une table MySQL comme celle-ci : </p> Nombre de pages de l'action <pre>company_name ---------------------------------- ENTREPRISE A IMPRIMER 3 ENTREPRISE A IMPRIMER 2 ENTREPRISE A IMPRIMER 3 Société BEMAIL Société B PRINT 2 Société B PRINT 2 SOCIÉTÉ B IMPRIMER 1 ENTREPRISE A IMPRIMER 3 ≪/pré> <p>Est-il possible d'exécuter une requête MySQL pour obtenir le résultat suivant : </p> <pre>nom_entreprise EMAIL IMPRIMER 1 page IMPRIMER 2 pages IMPRIMER 3 pages -------------------------------------------------- ---------- SociétéA 0 0 1 3 EntrepriseB 1 1 2 0 ≪/pré> <p>L'idée est que <code>pagecount</code> peut varier, donc le nombre de colonnes dans la sortie doit refléter cela, une pour chaque <code>action</code>/<code>pagecount< ;/code>, puis le nombre de clics pour chaque <code>company_name</code>. Je ne sais pas si cela s'appelle un tableau croisé dynamique, mais est-ce que quelqu'un l'a suggéré ? </p>
P粉481035232
P粉481035232

répondre à tous(2)
P粉154228483

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粉366946380

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 CASECASE语句。为了按某个东西进行分组,使用...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 :

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!