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 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:
- http://anothermysqldba.blogspot. de/2013/06/pivot-tables-example-in-mysql.html
- http://www.codeproject. com/Articles/363339/Cross-Tabulation-Pivot-Tables-with-MySQL
- http://datacharmer.org/downloads/pivot_tables_mysql_5.pdf
- https://codingsight.com/pivot-tables-in-mysql/