sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag returnera pivottabellutdata i MySQL?

Detta är i grunden en pivottabell.

En trevlig handledning om hur man uppnår detta finns här:http:// www.artfulsoftware.com/infotree/qrytip.php?id=78

Jag rekommenderar att du läser det här inlägget och anpassar den här lösningen efter dina behov.

Uppdatera

Efter att länken ovan för närvarande inte är tillgänglig längre känner jag mig skyldig att tillhandahålla lite ytterligare information till alla er som söker efter mysql pivot-svar här. Den hade verkligen en enorm mängd information, och jag kommer inte att lägga allt därifrån här (ännu mer eftersom jag bara inte vill kopiera deras enorma kunskap), men jag ska ge några råd om hur man hanterar pivot tabeller sql-sättet generellt med exemplet från peku som ställde frågan i första hand.

Kanske kommer länken tillbaka snart, jag ska hålla utkik efter den.

Kalkylarkssättet...

Många människor använder bara ett verktyg som MSExcel, OpenOffice eller andra kalkylbladsverktyg för detta ändamål. Detta är en giltig lösning, kopiera bara data där borta och använd verktygen som GUI erbjuder för att lösa detta.

Men... detta var inte frågan, och det kan till och med leda till vissa nackdelar, som hur man får in data i kalkylarket, problematisk skalning och så vidare.

SQL-sättet...

Med tanke på hans bord ser det ut ungefär så här:

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;

Titta nu in i hans/hennes önskade tabell:

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

Raderna (EMAIL , SKRIV ut x sidor ) liknar förhållanden. Huvudgrupperingen är efter företagsnamn .

För att ställa in villkoren ropar detta snarare för att använda FALL -påstående. För att gruppera efter något, ja, använd ... GROUP BY .

Den grundläggande SQL som tillhandahåller denna pivot kan se ut ungefär så här:

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

Detta bör ge det önskade resultatet mycket snabbt. Den stora nackdelen med detta tillvägagångssätt, ju fler rader du vill ha i din pivottabell, desto fler villkor behöver du definiera i din SQL-sats.

Detta kan också hanteras, därför brukar folk använda förberedda uttalanden, rutiner, räknare och sådant.

Några ytterligare länkar om detta ämne:



  1. Hur man utför installation av en EBS 12.2 Vision-instans

  2. Bygga och underhålla en HR-databas

  3. Postgres UTC datumformat &epok cast, tecken inversion

  4. Motsvarighet till Oracles RowID i MySQL