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