Это в основном - сводная таблица.
Хороший учебник о том, как этого добиться, можно найти здесь: 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.
С этим тоже можно справиться, поэтому люди склонны использовать подготовленные операторы., подпрограммы, счетчики и тому подобное.
Некоторые дополнительные ссылки по этой теме: