4

JaspersoftのiReportを使用して、MaintenanceAssistantCMMSデータベースからデータをプルするレポートを作成しています。DBはローカルホスト上にあり、テーブルや列を作成していません。MACMMSがそれを処理します。レポートに配置するためにデータをプルしたいだけです。

これが私のコードです:

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

GROUP BY 句を取り除きます。結果を並べ替えたいだけなら、代わりに ORDER BY を使用してください。それ以外の場合は、どちらも必要ありません。

編集

エラーが示すように、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" 
于 2013-03-22T18:41:54.497 に答える
0

はい - group by を使用するには、select 行で具体的に指定する必要があります。

最初に、表示するフィールドを決定します。それらすべてが必要な場合は、それらすべてを含めます。

COUNT() 関数を追加して選択したフィールドの数を取得したらすぐに、GROUP BY 句を追加する必要があります。COUNT() は、SUM() や AVG() などの AGGREGATE 関数です。

GROUP BY 句で非常に多くのフィールドを指定するのは少し直感に反し、少し面倒ですが、それは必要です。FIRST GROUP BY フィールドは最も重要です。これは、通常、これが問題になるためです。この最初のフィールドは、SELECT されたフィールドのいずれかである可能性があり、必ずしも最初である必要はありません。

COUNT() のような AGGREGATE 関数ではない GROUP BY に EVERY フィールドを含めます。

また、注文のグループを COUNT しようとしている場合、おそらく 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 に答える