To w zasadzie jest tabela przestawna.
Fajny samouczek, jak to osiągnąć, można znaleźć tutaj:http:// www.artfulsoftware.com/infotree/qrytip.php?id=78
Radzę przeczytać ten post i dostosować to rozwiązanie do swoich potrzeb.
Aktualizacja
Po tym, jak powyższy link nie jest już dostępny, czuję się zobowiązany do podania dodatkowych informacji dla wszystkich, którzy szukają tutaj odpowiedzi mysql pivot. Miał naprawdę ogromną ilość informacji i nie będę umieszczał wszystkiego stamtąd tutaj (tym bardziej, że po prostu nie chcę kopiować ich ogromnej wiedzy), ale dam kilka rad, jak radzić sobie z pivotem tabele w sposób sql ogólnie z przykładem od peku, który zadał pytanie w pierwszej kolejności.
Może link wkrótce wróci, będę go mieć na oku.
Sposób arkusza kalkulacyjnego...
Wiele osób po prostu używa do tego celu narzędzia takiego jak MSExcel, OpenOffice lub innych narzędzi do arkuszy kalkulacyjnych. To jest prawidłowe rozwiązanie, po prostu skopiuj tam dane i użyj narzędzi oferowanych przez GUI, aby rozwiązać ten problem.
Ale... to nie było pytanie, a to może nawet prowadzić do pewnych wad, takich jak sposób umieszczenia danych w arkuszu kalkulacyjnym, problematyczne skalowanie i tak dalej.
Sposób SQL...
Biorąc pod uwagę, że jego stół wygląda mniej więcej tak:
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;
Teraz zajrzyj do wybranego przez niego stołu:
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages
-------------------------------------------------------------
CompanyA 0 0 1 3
CompanyB 1 1 2 0
Wiersze (EMAIL
, PRINT x pages
) przypominają warunki. Główne grupowanie to company_name
.
Aby ustalić warunki, to raczej krzyczy za używanie CASE
-oświadczenie. Aby pogrupować według czegoś, użyj ... GROUP BY
.
Podstawowy kod SQL dostarczający tę oś może wyglądać mniej więcej tak:
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`;
Powinno to bardzo szybko zapewnić pożądany rezultat. Główną wadą tego podejścia jest to, że im więcej wierszy chcesz umieścić w tabeli przestawnej, tym więcej warunków musisz zdefiniować w instrukcji SQL.
Z tym również można sobie poradzić, dlatego ludzie mają tendencję do używania przygotowanych instrukcji, procedur, liczników i tym podobnych.
Kilka dodatkowych linków na ten temat:
- http://anothermysqldba.blogspot. de/2013/06/tabele-przestawne-przyklad-w-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/