В основном это - сводная таблица.
Хороший учебник о том, как этого достичь, можно найти здесь: http://www.artfulsoftware.com/ Обновить
g15]
После того, как ссылка выше в настоящее время недоступна, я чувствую себя обязанным предоставить дополнительную информацию для всех вас, ищущих ответы на mysql pivot. У него действительно было огромное количество информации, и я не буду вкладывать все оттуда сюда (еще больше, так как я просто не хочу копировать свои обширные знания), но я дам несколько советов о том, как справляться с точкой опоры таблицы sql в общем случае с примером из peku, который задал вопрос в первую очередь.
Возможно, ссылка скоро вернется, я буду следить за ней.
Метод электронной таблицы ...
Для этой цели многие используют инструмент MSExcel, OpenOffice или другие инструменты для работы с электронными таблицами. Это действительное решение, просто скопируйте данные и используйте инструменты, предлагаемые графическим интерфейсом для решения этой проблемы.
Но ... это был не вопрос, и это могло бы даже привести к некоторым недостаткам, например, как получить данные в электронную таблицу, проблемное масштабирование и т. д.
Путь 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-заявлении.
Это также может быть рассмотрено, поэтому люди склонны использовать подготовленные операторов, подпрограмм, счетчиков и т. д.
Некоторые дополнительные ссылки по этой теме:
Вы можете запустить rmiregistry из любого места, но вы должны убедиться, что скомпилированные классы уже находятся в вашем пути к классам. Например: -
E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>set classpath=%classpath%;E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes <ENTER>
E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>c: <ENTER>
C:\>rmiregistry
И выше должно работать нормально.
В общем случае, если вы запускаете rmiregistry из корневого расположения скомпилированных классов (пример выше E: \ ARMSRemoteUpdater \ WebContent \ WEB-INF \ classes), который будет работать, потому что. (dot-current directory) уже установлен в вашем пути к классам.
Но как только вы удалите. (dot-current directory) из вашего пути к классам, вышеуказанное рабочее условие также потерпит неудачу.
Надеюсь, что я подробно объяснил.
Есть три случая этого исключения.
UnicastRemoteObject
, чтобы сделать это ненужным. Это случай 2. Реестр не может найти именованный класс.
Существует четыре решения:
LocateRegistry.createRegistry().
UnicastRemoteObject.
. Однако вы все равно можете столкнуться с той же проблемой с самим удаленным интерфейсом или классом, от которого он зависит, и в этом случае 1-3 выше все еще применяются к этому классу / эти классы. java.rmi.server.UnicastRemoteObject
. Вам нужно всего лишь создать класс заглушки, если вы используете Java & lt; 1.5, или вы не следуете этим рекомендациям. Поскольку у вас есть это исключение, очевидно, что одно из этих двух истинно.
– user207421
3 March 2012 в 11:07
export CLASSPATH=myLib.jar:myLib2.jar
. перед запуском rmiregistry. Но я работаю над производственным развертыванием, и я заметил ваш комментарий к другому сообщению о том, что CLASSPATH предназначен для разработки, а конфигурация кодовой базы более подходит для развертывания. Понимаете ли вы, что CLASSPATH должен быть очищен для развертывания, и все сервер и клиенты, использующие rmi, будут использовать базу кода в конфигурации развертывания?
– simgineer
27 October 2017 в 19:09
Remote Server Error:RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: mathInterface
Ошибка, которую очень просто решить, выполнить следующие шаги:
(Где бы ни находился ваш файл, запустите rmiregistry
)
java.rmi.server.UnicastRemoteObject
. Вам нужно всего лишь создать класс заглушки, если вы используете Java & lt; 1.5, или вы не следуете этим рекомендациям. Поскольку у вас есть это исключение, очевидно, что одно из этих двух истинно. – user207421 3 March 2012 в 11:07export CLASSPATH=myLib.jar:myLib2.jar
. перед запуском rmiregistry. Но я работаю над производственным развертыванием, и я заметил ваш комментарий к другому сообщению о том, что CLASSPATH предназначен для разработки, а конфигурация кодовой базы более подходит для развертывания. Понимаете ли вы, что CLASSPATH должен быть очищен для развертывания, и все сервер и клиенты, использующие rmi, будут использовать базу кода в конфигурации развертывания? – simgineer 27 October 2017 в 19:09