sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg returnere pivottabeloutput i MySQL?

Dette er dybest set en pivottabel.

En god vejledning om, hvordan du opnår dette, kan findes her:http:// www.artfulsoftware.com/infotree/qrytip.php?id=78

Jeg anbefaler at læse dette indlæg og tilpasse denne løsning til dine behov.

Opdater

Efter at linket ovenfor i øjeblikket ikke længere er tilgængeligt føler jeg mig forpligtet til at give nogle yderligere oplysninger til alle jer, der søger efter mysql pivot-svar herinde. Det havde virkelig en enorm mængde information, og jeg vil ikke lægge alt derfra herind (endnu mere, da jeg bare ikke vil kopiere deres store viden), men jeg vil give nogle råd om, hvordan man håndterer pivot tabeller sql-måden generelt med eksemplet fra peku, der stillede spørgsmålet i første omgang.

Måske kommer linket snart tilbage, jeg holder øje med det.

Regnearksmåden...

Mange mennesker bruger bare et værktøj som MSExcel, OpenOffice eller andre regneark-værktøjer til dette formål. Dette er en gyldig løsning, bare kopier dataene derovre og brug de værktøjer, som GUI tilbyder til at løse dette.

Men... dette var ikke spørgsmålet, og det kan endda føre til nogle ulemper, såsom hvordan man får dataene ind i regnearket, problematisk skalering og så videre.

SQL-måden...

Givet hans bord ser noget sådan ud:

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;

Kig nu ind i hans/hendes ønskede tabel:

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

Rækkerne (EMAIL , UDSKRIV x sider ) ligner forhold. Hovedgrupperingen er efter virksomhedsnavn .

For at opsætte betingelserne råber dette snarere for at bruge CASE -udmelding. For at gruppere efter noget, så brug ... GROUP BY .

Den grundlæggende SQL, der giver denne pivot, kan se sådan ud:

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

Dette skulle give det ønskede resultat meget hurtigt. Den største ulempe ved denne tilgang, jo flere rækker du ønsker i din pivottabel, jo flere betingelser skal du definere i din SQL-sætning.

Dette kan også håndteres, derfor har folk en tendens til at bruge forberedte erklæringer, rutiner, tællere og sådan.

Nogle yderligere links om dette emne:



  1. Django+Postgres:aktuelle transaktion afbrydes, kommandoer ignoreret indtil slutningen af ​​transaktionsblok

  2. Kalder lagret procedure med Out-parameter ved hjælp af PDO

  3. Top fem overvejelser for databaseindeksdesign i SQL Server

  4. Hvor gemmer PostgreSQL konfigurations-/conf-filer?