Maison  >  Questions et réponses  >  le corps du texte

Comment implémenter la sortie du tableau croisé dynamique dans MySQL

<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粉481035232P粉481035232425 Il y a quelques jours509

répondre à tous(2)je répondrai

  • P粉154228483

    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

    répondre
    0
  • P粉366946380

    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 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 :

    répondre
    0
  • Annulerrépondre