3

次のクエリは見事に機能します。今、エラーコードPRODUCT.*につながるものを選択しようとしています

42Y36: (Column reference '<value>' is invalid. For a SELECT list with a GROUP BY, the list may only contain grouping columns and valid aggregate expressions.)

次に、エラーコードにつながる と の両方を設定しようしましSELECTGROUP BYPRODUCT.*

42X01: (Syntax error: <error>.)

単純な構文エラー。わかりました、 . でワイルドカードを使用することは許可されていないようGROUP BYです。したがって、私の質問は (サブクエリを必要とせずに)、 「定義された-clauseを使用しているときにオブジェクト全体を選択するにはどうすればよいですか?」です。HAVING

SELECT      PRODUCT.ID
FROM        PRODUCT
LEFT JOIN   DELIVERYROW   ON  DELIVERYROW.PRODUCT_ID = PRODUCT.ID
LEFT JOIN   DISPATCHROW   ON  DISPATCHROW.PRODUCT_ID = PRODUCT.ID
WHERE       PRODUCT.DTYPE = 'PRODUCT'
GROUP BY    PRODUCT.ID
HAVING      (
                COALESCE(SUM(DELIVERYROW.AMOUNT),0) 
                - 
                COALESCE(SUM(DISPATCHROW.AMOUNT),0)
            ) > 0
4

1 に答える 1

4

集計関数を使用しない限り、グループ化されていないアイテムを選択することはできません。

選択に他の値を含めることができますが、それらでグループ化するか、SUM()、AVG()、MIN()、MAX() などを実行する必要があります。これが、product.* で機能しない理由です。 select、あなたは私にすべての列を与えていると言っていますが、product.idでグループ化するだけです

group by を説明するための回答を展開します...

product テーブルに 4 つの列があるとします。ID | コスト | 名前 | 日付 | ID でグループ化すると、同じ ID を持つすべての行が 1 つの行に折りたたまれます。他の列を表示する場合は、それらに対して集計関数を実行する必要があります。たとえば、ID でグループ化して min(date) を取得し、 max(date) を使用して各製品 ID の最小/最大日付を取得し、sum(cost) と avg(cost) を使用して要約と平均を取得することもできます。

複数の列でグループ化できるため、ID と名前でグループ化し、2 つの一意の組み合わせごとに行を取得できます。* でグループ化することはできません。テーブル全体が返されるだけなので、あまり意味がありません。

取得しているエラーは、グループ化されていない列を選択しようとしたことが原因です。

出力に何を表示しますか?

于 2013-05-11T17:52:59.503 に答える