4

我正在使用 Jaspersoft 的 iReport 创建一个报告,该报告将从我的维护助手 CMMS 数据库中提取数据。数据库位于本地主机上,我没有创建任何表或列。MA CMMS 负责这一点。我只想提取数据以安排在报告中。

这是我的代码:

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

和我的错误:

原因:java.sql.SQLSyntaxErrorException:列引用“tblWorkOrderTask.id”无效,或者是无效表达式的一部分。对于带有 GROUP BY 的 SELECT 列表,被选择的列和表达式只能包含有效的分组表达式和有效的聚合表达式。

我不知道为什么错误是指“tblWorkOrderTask.id”,因为我没有这样的列,也没有要求该列。

如果我取出 group by 子句,它可以正常工作,但正如您所料,我会得到具有相同 WorkOrderID 的多个结果。我想按此列分组,然后统计结果。我尝试使用 SELECT DISTINCT,但随后我收到有关未选择的列的错误。

4

3 回答 3

3

您正在选择 tblWorkOrderTask 表中的所有列。“id”列是该表中的第一列。您收到错误消息,因为您没有在选择列表中指定所有列。

此选择会起作用,但我不确定您需要从表中获取哪些信息。

SELECT id, intworkorderid
FROM tblWorkOrderTask 
group by id, intworkorderid

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

于 2013-03-22T18:36:00.210 回答
0

Get rid of the GROUP BY clause -- if you're just trying to order the result, then use ORDER BY instead; but otherwise, you don't need either.

EDIT

As the error says, everythign in your SELECT list must be one of two things -- either 1) also listed in your GROUP BY list, or 2) an aggregated value. Here is a sample that will work:

SELECT intworkorderid, COUNT(*) 
FROM   "tblworkordertask" 
WHERE  "dbltimespenthours" > 0 
       AND "dtmdatecompleted" BETWEEN $P{DATE_FROM} AND $P{DATE_TO}
GROUP  BY "intworkorderid" 
于 2013-03-22T18:41:54.497 回答
0

是的 - 为了使用分组依据,您需要在选择行中具体说明。

因此,首先,决定要显示哪些字段。如果您想要所有这些,则将它们全部包含在内。

添加 COUNT() 函数以获取所选字段的计数后,您将需要添加 GROUP BY 子句。COUNT() 是一个 AGGREGATE 函数,类似于 SUM() 和 AVG()。

在 GROUP BY 子句中指定这么多字段有点违反直觉,有点痛苦,但这是必要的。FIRST GROUP BY 字段是最重要的,因为这通常是您所关心的。第一个字段可以是任何 SELECTed 字段,它不一定是第一个。

在 GROUP BY 中包含不是 COUNT() 等 AGGREGATE 函数的每个字段。

此外,如果您尝试对一组订单进行计数,您可能不需要或不需要 SELECT 中的所有字段。您可能只想指定对工作订单 ID 唯一的字段。

示例:如果您想获取这些字段的 COUNT,您将指定除 COUNT() 之外的所有 SELECTED 字段。

SELECT
    intWorkOrderID,
    COUNT(id),
    strDescription
FROM   tblworkordertask
WHERE  dbltimespenthours > 0 
       AND dtmdatecompleted BETWEEN $P{DATE_FROM} AND $P{DATE_TO}
GROUP BY
    intworkorderid,
    strDescription
于 2013-03-26T17:08:17.800 回答