recherche

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

Comment renvoyer la sortie d’un 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>Pouvez-vous exécuter une requête MySQL pour obtenir le résultat suivant : </p> <pre>nom_entreprise EMAIL IMPRIMER 1 pages 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 le nombre de pages peut varier. Le nombre de colonnes dans le résultat doit donc refléter cela, avec une colonne pour chaque nombre d'actions/pages, puis compter le nombre de clics pour chaque nom d'entreprise. Je ne sais pas si cela s'appelle un tableau croisé dynamique, mais quelqu'un a suggéré de le faire. </p>
P粉578343994P粉578343994496 Il y a quelques jours512

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

  • P粉461599845

    P粉4615998452023-07-26 12:06:35

    Ma solution consiste à utiliser T-SQL au lieu de n'importe quel tableau croisé dynamique :

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

    P粉5742689892023-07-26 00:37:24

    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 de l'adapter à vos propres 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. Ce lien contient vraiment beaucoup d'informations, je ne vais pas tout copier (et je ne veux pas copier leur richesse de connaissances), mais je vais donner quelques conseils sur la façon de travailler avec des tableaux croisés dynamiques en SQL, avec peku Prenons la question posée comme exemple.

    Peut-être que le lien sera bientôt rétabli, je garderai un œil dessus.

    La méthode des feuilles de calcul...

    Beaucoup de gens utilisent simplement des outils comme MSExcel, OpenOffice ou d'autres outils de feuilles de calcul pour accomplir cette tâche. 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 certains inconvénients, comme la façon d'importer des données dans des feuilles de calcul, des problèmes d'évolutivité, etc.

    Façon SQL...

    Supposons que sa table 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;

    Regardez maintenant le tableau des attentes :

    company_name    EMAIL   PRINT 1 pages   PRINT 2 pages   PRINT 3 pages
    -------------------------------------------------------------
    CompanyA        0       0               1               3
    CompanyB        1       1               2               0

    La ligne (EMAIL, imprimer x pages) est comme une condition. Le regroupement principal se fait par nom d'entreprise.

    Afin de définir des conditions, il est plus approprié d'utiliser l'instruction CASE. Pour regrouper par quelque chose, vous pouvez utiliser GROUP BY.

    Une instruction 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 souhaitez avoir de lignes dans le tableau croisé dynamique, plus vous devez définir de conditions dans l'instruction SQL.

    Ce problème peut également être résolu, c'est pourquoi les gens ont tendance à utiliser des instructions préparées, des routines, des compteurs, etc.

    Voici quelques liens supplémentaires sur ce sujet :


    répondre
    0
  • Annulerrépondre