Zasadniczo jest to tabela przestawna.
Miły 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
Ponieważ powyższy link nie jest już dostępny, czuję się zobowiązany do podania dodatkowych informacji dla was wszystkich, którzy szukają tutaj odpowiedzi mysql pivot. Naprawdę miał ogromną ilość informacji i nie umieszczę tutaj wszystkiego (tym bardziej, że po prostu nie chcę kopiować ich ogromnej wiedzy), ale dam kilka wskazówek, jak radzić sobie z osią przestawną tabele sql ogólnie na przykładzie z peku, który zadał pytanie w pierwszej kolejności.
Może link wkrótce wróci, będę go pilnować.
Sposób arkusza kalkulacyjnego ...
Wiele osób korzysta w tym celu z narzędzi takich jak MSExcel, OpenOffice lub innych narzędzi do obsługi arkuszy kalkulacyjnych. To prawidłowe rozwiązanie, po prostu skopiuj tam dane i skorzystaj z narzędzi oferowanych przez GUI, aby to rozwiązać.
Ale ... to nie było pytanie, a może nawet prowadzić do pewnych wad, takich jak sposób wprowadzenia danych do arkusza kalkulacyjnego, problematyczne skalowanie i tak dalej.
Sposób SQL ...
Biorąc pod uwagę 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 spójrz na jego / jej pożądany stół:
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 ugrupowanie to company_name
.
Aby skonfigurować warunki, raczej krzyczy o użyciu CASE
-statement. W celu grupy przez coś, dobrze, stosowanie ... GROUP BY
.
Podstawowy SQL zapewniający ten element przestawny 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 zapewnić bardzo szybko pożądany wynik. Głównym minusem tego podejścia jest to, że im więcej wierszy chcesz w tabeli przestawnej, tym więcej warunków musisz zdefiniować w instrukcji SQL.
Można to również rozwiązać, dlatego ludzie używają gotowych instrukcji, procedur, liczników i tym podobnych.
Kilka dodatkowych linków na ten temat: