Това основно е въртяща се таблица.
Хубав урок за това как да постигнете това можете да намерите тук:http:// www.artfulsoftware.com/infotree/qrytip.php?id=78
Съветвам ви да прочетете тази публикация и да адаптирате това решение към вашите нужди.
Актуализиране
След като връзката по-горе в момента вече не е налична, се чувствам длъжен да предоставя допълнителна информация за всички вас, които търсите отговори на mysql тук. Наистина имаше огромно количество информация и няма да поставя всичко оттам тук (още повече, тъй като просто не искам да копирам огромните им знания), но ще дам някои съвети как да се справя с pivot таблици по начина на sql като цяло с примера от peku, който зададе въпроса на първо място.
Може би връзката се върне скоро, ще я следя.
Начинът на електронни таблици...
Много хора просто използват инструмент като MSExcel, OpenOffice или други инструменти за електронни таблици за тази цел. Това е валидно решение, просто копирайте данните там и използвайте инструментите, които GUI предлага, за да разрешите това.
Но... това не беше въпросът и дори може да доведе до някои недостатъци, като например как да вкарате данните в електронната таблица, проблемно мащабиране и така нататък.
Начинът на SQL...
Като се има предвид, че масата му изглежда така:
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;
Сега погледнете желаната от него/нейната таблица:
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages
-------------------------------------------------------------
CompanyA 0 0 1 3
CompanyB 1 1 2 0
Редовете (EMAIL
, PRINT x pages
) приличат на условия. Основното групиране е по company_name
.
За да настрои условията, това по-скоро вика за използване на CASE
-изявление. За да групирате по нещо, използвайте ... GROUP BY
.
Основният SQL, осигуряващ тази опорна точка, може да изглежда така:
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`;
Това трябва да осигури желания резултат много бързо. Основният недостатък на този подход е, че колкото повече редове искате във вашата основна таблица, толкова повече условия трябва да дефинирате във вашия SQL израз.
Това също може да се справи, следователно хората са склонни да използват подготвени изявления, процедури, броячи и други.
Някои допълнителни връзки по тази тема:
- 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/