2013-03-22 3 views
3

Я использую iReport от Jaspersoft для создания отчета, который будет извлекать данные из моей базы данных CMMS Maintenance Assistant. БД находится на локальном хосте, и я не создаю никаких таблиц или столбцов. MA CMMS позаботится об этом. Я хочу, чтобы данные были упорядочены в отчете.Ссылка на SQL-столбец недействительна

Вот мой код:

SELECT * 
FROM "tblworkordertask" 
WHERE "dbltimespenthours" > 0 
     AND "dtmdatecompleted" BETWEEN $P{DATE_FROM} AND $P{DATE_TO} 
GROUP BY "intworkorderid" 

и моя ошибка:

Caused by: java.sql.SQLSyntaxErrorException: Column reference 'tblWorkOrderTask.id' is invalid, or is part of an invalid expression.  For a SELECT list with a GROUP BY, the columns and expressions being selected may only contain valid grouping expressions and valid aggregate expressions.

Я не знаю, почему ошибка имеет в виду «tblWorkOrderTask.id», потому что у меня нет таких колонке, и я не просил эту колонку.

Если я вывожу предложение group by, он работает нормально, но, как вы могли ожидать, я получаю несколько результатов с одним и тем же WorkOrderID. Я хочу сгруппировать его по этому столбцу, а затем подсчитать результаты. Я попытался использовать SELECT DISTINCT, но потом получаю ошибки о столбцах, которые не выбраны.

+0

Что представляют собой поля в tblWorkOrderTask? – kevro

+0

На данный момент я не работаю, но я обязательно посмотрю на это. Я знаю, что для этого отчета мне только немного о них. –

+0

Поля: «id», «intWorkOrderID», «intOrder», «dblTimeSpentHours», «strDescription», «intAssignedToUserID», «dtmDateCompleted», «intCompletedByUserID» –

ответ

2

Вы выбираете все столбцы в таблице tblWorkOrderTask. Столбец «id» - это первый столбец в этой таблице. Вы получаете сообщение об ошибке, потому что у вас нет всех столбцов, указанных в списке выбора.

Этот выбор будет работать, но я не уверен, какая информация вам нужна из таблицы.

SELECT id, intworkorderid 
FROM tblWorkOrderTask 
group by id, intworkorderid 

http://www.w3schools.com/sql/sql_groupby.asp

+0

Итак, если я правильно вас понимаю, чтобы использовать группу по , вам нужно быть конкретным в строке выбора? Если мне нужно, мне нужно индивидуально выбрать все поля? Кроме того, зачем использовать идентификатор в группе? мне нужно группировать по первому столбцу всегда? даже если все записи имеют уникальное значение? –

+0

Я работал со всей информацией, которую вы предоставили, но вы должны включить все столбцы неагрегата из списка в группе. Ваша группа может иметь больше столбцов, чем в выбранном вами, но не менее. – Vinnie

+0

Хорошо, так что я попытался это: выбрать "ID", "intWorkOrderID" от "tblWorkOrderTask" где "dblTimeSpentHours"> 0 и "dtmDateCompleted" между $ P {DATE_FROM} и $ P {DATE_TO} группы по «id», «intWorkOrderID» Как вы сказали, группа содержит одинаковые столбцы из списка выбора. Однако сейчас я получаю: Ошибка заполнения печати ... Неизвестное имя столбца: intOrder net.sf.jasperreports.engine.JRException: неизвестно имя столбца: intOrder Этот столбец третий столбец, после столбца WorkorderID. Это не в моем списке выбора, а где-то еще в моем коде/отчете. Так почему это волнует? –

0

Избавиться от предложения GROUP BY - если вы просто пытаетесь сделать заказ результат, а затем использовать ORDER BY вместо; но в остальном вам тоже не нужно.

EDIT

Как говорит ошибка, everythign в вашем списке SELECT, должен быть один из двух - либо 1) также перечислены в вашем списке GROUP BY или 2) агрегированной значение. Вот пример, который будет работать:

SELECT intworkorderid, COUNT(*) 
FROM "tblworkordertask" 
WHERE "dbltimespenthours" > 0 
     AND "dtmdatecompleted" BETWEEN $P{DATE_FROM} AND $P{DATE_TO} 
GROUP BY "intworkorderid" 
+0

Нет, извините ... Мне все равно, заказано это или нет, я просто хочу сгруппировать результаты по номеру заказа на работу. Рабочие заказы имеют несколько задач, и CMMS сохраняет каждую задачу в качестве записи, поэтому есть несколько записей, каждый из которых имеет один и тот же номер заказа на работу. Все, что я хочу знать, состоит в том, сколько уникальных заказов на работу имеет поле срочного завершения. –

+0

@KevinSadowy - вам не хватает смысла. 'ORDER BY' ** ** будет группировать ваши результаты. Поскольку вы не используете агрегацию, и вы не используете фильтр «HAVING», вам не нужна «GROUP BY». «GROUP BY» имеет особые требования - если вы собираетесь использовать его, вы должны следовать правилам для него (т. Е. Перечислять все свои поля в 'SELECT', а затем перечислять их все снова в' GROUP BY'). В любом случае это сработает, но вы не сможете использовать его в сочетании с 'SELECT *' - об этом говорит вам ошибка. – Chains

+0

@KevinSadowy - см. Обновленный пример, демонстрирующий, что ошибка говорит вам/как удовлетворить требование. – Chains

0

Да - для того, чтобы использовать группу, вы должны быть конкретными в строке выбора.

Итак, сначала определите, какие поля вы хотите отображать. Если вы хотите их всех, то включите их все.

Как только вы добавите функцию COUNT(), чтобы получить количество выбранных полей, вам нужно будет добавить предложение GROUP BY. COUNT() - функция AGGREGATE, такая как SUM() и AVG().

Это немного контр-интуитивный и немного боль, чтобы указать так много полей в предложении GROUP BY, но это необходимо. Поле FIRST GROUP BY является самым важным, так как обычно это вас беспокоит. Это первое поле может быть любым из полей SELECTed, это не обязательно первое.

Включите КАЖДОЕ поле в своей GROUP BY, которое не является функцией AGGREGATE, такой как COUNT().

Кроме того, если вы пытаетесь выполнить COUNT для группы заказов, вам, вероятно, не нужны или не нужны все поля в SELECT. Возможно, вы хотите указать только те поля, которые уникальны для идентификатора заказа на работу.

Пример: Если вы хотите получить COUNT из этих полей, вы должны указать все поля SELECTED EXCEPT COUNT().

SELECT 
    intWorkOrderID, 
    COUNT(id), 
    strDescription 
FROM tblworkordertask 
WHERE dbltimespenthours > 0 
     AND dtmdatecompleted BETWEEN $P{DATE_FROM} AND $P{DATE_TO} 
GROUP BY 
    intworkorderid, 
    strDescription