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