Toto v podstatě je kontingenční tabulka.
Pěkný návod, jak toho dosáhnout, najdete zde:http:// www.artfulsoftware.com/infotree/qrytip.php?id=78
Doporučuji přečíst si tento příspěvek a přizpůsobit toto řešení svým potřebám.
Aktualizovat
Poté, co výše uvedený odkaz v současné době již není k dispozici, cítím povinnost poskytnout některé další informace pro vás všechny, kteří zde hledají odpovědi na pivot mysql. Bylo v něm opravdu obrovské množství informací a nebudu sem dávat vše odtamtud (o to víc, protože nechci kopírovat jejich rozsáhlé znalosti), ale dám vám pár rad, jak se vypořádat s pivotem tabulky způsobem sql obecně s příkladem z peku, který položil otázku jako první.
Možná se odkaz brzy vrátí, budu na to dávat pozor.
Tabulkový způsob...
Mnoho lidí k tomuto účelu používá pouze nástroj jako MSExcel, OpenOffice nebo jiné tabulkové procesory. Toto je platné řešení, stačí tam zkopírovat data a použít nástroje, které GUI nabízí.
Ale... to nebyla otázka a dokonce to mohlo vést k určitým nevýhodám, jako je způsob, jak dostat data do tabulky, problematické škálování a tak dále.
Cesta SQL...
Vzhledem k tomu, že jeho tabulka vypadá asi takto:
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;
Nyní se podívejte do jeho/její požadované tabulky:
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages
-------------------------------------------------------------
CompanyA 0 0 1 3
CompanyB 1 1 2 0
Řádky (EMAIL
, PRINT x pages
) podobají podmínkám. Hlavní seskupení je podle company_name
.
Za účelem nastavení podmínek to spíše volá po použití CASE
-prohlášení. Chcete-li seskupit podle něčeho, použijte ... GROUP BY
.
Základní SQL poskytující tento pivot může vypadat nějak takto:
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`;
To by mělo poskytnout požadovaný výsledek velmi rychle. Hlavní nevýhodou tohoto přístupu je, že čím více řádků chcete v kontingenční tabulce, tím více podmínek musíte definovat v příkazu SQL.
I to se dá řešit, proto lidé mají tendenci používat připravené příkazy, rutiny, počítadla a podobně.
Některé další odkazy k tomuto tématu:
- 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/