sql >> データベース >  >> RDS >> Oracle

ORA-00904groupby句の識別子の「無効な識別子」

    order byを除いて、同じレベルのSQLで列エイリアスを参照することはできません。 条項。

    ドキュメントから(強調を追加):

    列エイリアスc_aliasを使用できます 、選択リストの直前の式にラベルを付けて、列が新しい見出しで表示されるようにします。エイリアスは、クエリの期間中、選択リストアイテムの名前を効果的に変更します。 エイリアスはORDER BYで使用できます 句ですが、クエリ内の他の句ではありません

    QTYLIVを参照する場合 GROUP BYで 選択リストはまだ評価されておらず、エイリアスは存在しません。これは、クエリが解析および実行される方法です。

    選択リストに複雑な式がある場合、それを外側の選択でラップし、後でグループ化するのが最も簡単なことがよくあります。

    SELECT *
    FROM (
      SELECT p.name AS design,
        p.M_PRODUCT_CATEGORY_ID,
        il.PRICEACTUAL   AS price,
        bp.C_BPARTNER_ID AS idpartner,
        CASE
      ...
        (SELECT qtyinvoiced
        FROM C_InvoiceLine il
        WHERE bp.ISCUSTOMER ='Y'
        AND bp.C_BPARTNER_ID= 18888
        )               AS qtyliv,
      ...
        i.DATEINVOICED AS dat
      FROM C_InvoiceLine il
      INNER JOIN M_PRODUCT p
      ...
      ON (oi.c_location_id=loc2.c_location_id)
        --WHERE i.DateInvoiced BETWEEN $P{Date1} AND $P{Date2}
        --AND
        --i.DocStatus in ('CO','CL')
        --AND i.IsSoTrx = 'Y'
        --AND   p.isstocked='Y'
    )
    GROUP BY name ,
      M_PRODUCT_CATEGORY_ID,
      QTYINVOICED,
      PRICEACTUAL,
    ...
      qtyliv,
      qtydepot
    ORDER BY name ,
      dateinvoiced ;
    

    GROUP BYでは元のテーブルエイリアスを使用しないことに注意してください またはORDER BY 外側のselectの句は、スコープ内にないためです。



    1. ORA-00918:SELECTであいまいに定義された列*

    2. MariaDBでのDATE_SUB()のしくみ

    3. SET TEXTSIZEがSQLServerで機能しませんか?これをチェックして。

    4. OracleデータベースをAWSEC2からAWSRDSに移行する方法