sql >> Database >  >> RDS >> Mysql

Hoe kan ik de uitvoer van de draaitabel in MySQL retourneren?

Dit is in feite is een draaitabel.

Een mooie tutorial over hoe dit te bereiken is hier te vinden:http:// www.artfulsoftware.com/infotree/qrytip.php?id=78

Ik raad aan dit bericht te lezen en deze oplossing aan uw behoeften aan te passen.

Bijwerken

Nadat de bovenstaande link momenteel niet langer beschikbaar is, voel ik me verplicht om wat aanvullende informatie te verstrekken voor iedereen die hier naar mysql-pivot-antwoorden zoekt. Het had echt een enorme hoeveelheid informatie, en ik zal niet alles van daaruit hier plaatsen (temeer omdat ik hun enorme kennis gewoon niet wil kopiëren), maar ik zal wat advies geven over hoe om te gaan met pivot tabellen op de sql-manier in het algemeen met het voorbeeld van peku die de vraag in de eerste plaats stelde.

Misschien komt de link binnenkort terug, ik zal er op letten.

Op de spreadsheet-manier...

Veel mensen gebruiken hiervoor gewoon een tool zoals MSExcel, OpenOffice of andere spreadsheet-tools. Dit is een geldige oplossing, kopieer gewoon de gegevens daar en gebruik de tools die de GUI biedt om dit op te lossen.

Maar... dit was niet de vraag, en het zou zelfs tot nadelen kunnen leiden, zoals hoe de gegevens in de spreadsheet te krijgen, problematisch schalen enzovoort.

De SQL-manier...

Gezien zijn tabel er ongeveer zo uitziet:

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;

Kijk nu in zijn/haar gewenste tafel:

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

De rijen (EMAIL , PRINT x pages ) lijken op omstandigheden. De hoofdgroepering is op company_name .

Om de voorwaarden in te stellen schreeuwt dit nogal om het gebruik van de CASE -uitspraak. Om op iets te groeperen, wel, gebruik ... GROUP BY .

De basis-SQL die deze spil levert, kan er ongeveer zo uitzien:

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`;

Dit moet zeer snel het gewenste resultaat opleveren. Het belangrijkste nadeel van deze aanpak is dat hoe meer rijen u in uw draaitabel wilt, hoe meer voorwaarden u in uw SQL-instructie moet definiëren.

Dit kan ook worden aangepakt, daarom hebben mensen de neiging om voorbereide verklaringen, routines, tellers en dergelijke te gebruiken.

Enkele aanvullende links over dit onderwerp:



  1. Datum ophalen in sql-server, CURRENT_TIMESTAMP vs GetDate()

  2. Waarom geen vensterfuncties in waar-clausules?

  3. De ADO.NET-provider 'Oracle.ManagedDataAccess.Client' is niet geregistreerd in het configuratiebestand van de machine of de toepassing, of kan niet worden geladen

  4. error:'Kan geen verbinding maken met lokale MySQL-server via socket '/var/run/mysqld/mysqld.sock' (2)' -- Ontbrekend /var/run/mysqld/mysqld.sock