-4

このクエリは何も表示していません。サブクエリで一致する ORDERNO のみの結果が必要です。

SELECT SUM(STY.NQTY * STY.NUNITPRICE   
             / 1000) AS ORDERAMOUNT,
    (SELECT SUM(TBLORDERSTYLE.NQTY * TBLORDERSTYLE.NUNITPRICE/1000) FROM TBLORDER
    INNER JOIN TBLORDERSTYLE
    ON TBLORDER.CORDERNO = TBLORDERSTYLE.CORDERNO
    WHERE TBLORDER.CLCNO LIKE '%MR#%' AND
    TBLORDER.CORDERNO = ORD.CORDERNO
    GROUP BY ORD.CORDERNO) AS K
          FROM TBLORDER ORD INNER JOIN   
          TBLORDERSTYLE STY ON    
          ORD.CORDERNO = STY.CORDERNO
          where (ORD.NPOSTFLAG = '1') AND   
           (ORD.NCANCEL = '0') AND
    ORD.NPAYMODE = '1'  AND  
          (ORD.DPICONFIRMDATE  BETWEEN    
          TO_DATE('01-JUL-2012')AND TO_DATE('31-JUL-2012'))
4

1 に答える 1

1

エラー メッセージは明確です。GROUP BY 句がありません。SUM() などの集計関数と集計されていない列を混在させる場合は常に、静的列を GROUP BY 句に含める必要があります。

あなたのコードでは、静的列はK. はい、集計から派生していますが、それはサブクエリ内にあるため、非集計列としてカウントされます。

これを解決する方法は、サブクエリを共通のテーブル式 (Oracle がサブクエリ ファクタリングと呼ぶもの) に移動することです。これにより、列を複数回参照することが容易になります。WITH 句の使用については、『Oracle SQL リファレンス』で説明されています。 詳細をご覧ください

with cte as (SELECT ORD.CORDERNO
                   , SUM(TBLORDERSTYLE.NQTY * TBLORDERSTYLE.NUNITPRICE/1000) as k
    FROM TBLORDER
    INNER JOIN TBLORDERSTYLE
    ON TBLORDER.CORDERNO = TBLORDERSTYLE.CORDERNO
    WHERE TBLORDER.CLCNO LIKE '%MR#%' AND
    TBLORDER.CORDERNO = ORD.CORDERNO
    GROUP BY ORD.CORDERNO)
SELECT SUM(STY.NQTY * STY.NUNITPRICE   
             / 1000) AS ORDERAMOUNT,
      cte.K
          FROM cte inner join
          TBLORDER ORD on ord.orderno = k.orderno
          INNER JOIN TBLORDERSTYLE STY ON STY.CORDERNO  = k.orderno
          where (ORD.NPOSTFLAG = '1') AND   
           (ORD.NCANCEL = '0') AND
           ORD.NPAYMODE = '1'  AND  
          (ORD.DPICONFIRMDATE  BETWEEN TO_DATE('01-JUL-2012')AND TO_DATE('31-JUL-2012'))
group by cte.k

これは、必要な実際のロジックではない可能性が高いです。実装しようとしているビジネス ルールの説明が含まれていなかったので、サブクエリをメイン クエリに結合する方法を推測しました。

于 2013-02-11T09:53:01.997 に答える