recherche

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

Comment renvoyer la sortie du tableau croisé dynamique dans MySQL ?

<p>Si j'ai une table MySQL qui ressemble à ceci : </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 un résultat comme celui-ci : </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 <code>pagecount</code> peut varier, donc le nombre de colonnes de sortie doit refléter cela, pour chaque <code>action</code>/<code>pagecount</code> Pour une colonne, indiquez 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粉926174288P粉926174288476 Il y a quelques jours427

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

  • P粉368878176

    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

    répondre
    0
  • P粉384244473

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

    répondre
    0
  • Annulerrépondre