2017-02-21 85 views
0

誰でも私はこのDb2のクエリ構文が間違っていることを理解するのに役立つことができますが、それはSQLCODE -120で失敗しています、なぜなら私はrow_number()DB2 - 集計関数の無効な使用SQLCODE = -120

 SELECT COUNT(ORDER_ID) OVER() TOTAL_NO_OF_RECORDS, 
     ROW_NUMBER() OVER (ORDER BY CREATED_DATE DESC) AS ROW_NUM 
     FROM (
     SELECT DISTINCT A.ORDER_ID ORDER_ID, 
     B.AgencyName AS AGENCY_NAME, 
     C.FirstName FIRST_NAME, 
     C.LastName LAST_NAME, 
     DEMOGRAPHIC.State STATE, 
     A.CreatedTS CREATED_DATE, 
     E.WritingTIN WRITING_TIN, 
     E.ParentTIN PARENT_TIN 
     FROM DBO.TABLE1 A 
     INNER JOIN 
     DBO.TABLE2 TABLE2 ON TABLE2.ORDER_ID=A.ORDER_ID 
     INNER JOIN 
     DBO.TABLE3 TABLE3 ON TABLE3.QuoteId=TABLE2.QuoteId 
     INNER JOIN 
     DBO.Demographic DEMOGRAPHIC ON 
DEMOGRAPHIC.DemographicId=TABLE3 .DemographicId 
     INNER JOIN 
     DBO.Agent E ON E.AgentId=DEMOGRAPHIC.AgentId 
     INNER JOIN 
     DBO.User USER ON USER.WebAcctID=AGENT.WebAcctId 
     INNER JOIN 
     DBO.Shopper SHOPPER ON SHOPPER.ShopperId=DEMOGRAPHIC.ShopperId 
     LEFT OUTER JOIN 
     DBO.Subsidy D ON D.demographicId=DEMOGRAPHIC.demographicId 
     LEFT OUTER JOIN 
     DBO.Employer EMPLOYER ON DEMOGRAPHIC.demographicId=EMPLOYER.demographicId 
     WHERE E.WritingTIN = 'XYZ' AND E.ParentTIN = 'XYZ' 
     AND DEMOGRAPHIC.State='OH' 
     AND A.Status IN ('X','Y','Z') 
     )AS ORDER_DETAILS 
     where ROW_NUMBER() OVER (ORDER BY CREATED_DATE DESC) BETWEEN ((1*50)-50)+1 AND 1*50 ORDER BY CREATED_DATE DESC 

示されたエラー:集約関数またはOLAP関数の使用が無効です。.. SQLCODE = -120、SQLSTATE = 42903、DRIVER = 4.18.60

+0

LEFT JOINの場合は、右側のテーブル条件をON句に入れて、真のLEFT JOIN動作を取得します。 (WHEREで、あなたは定期的な内部結合の結果を得るでしょう...) – jarlh

+0

@jarlhの問題は、join.itは集計関数の間違った使用法によるものではありません.i簡単な目的のためにクエリを変更しました。 SQLCODE = -120、SQLSTATE = 42903 – RVR

+0

私のコメントは、問題を解決するためのものではなく、単に結合を改善するためのものです。 – jarlh

答えて

0

あなたは、複数のエラーがあります:

  • をサブクエリにXが定義されていません。
  • B.CREATED_DATEは外部クエリで参照されますが、定義されていません。
  • ROW_NUMBER()は、WHERE節で使用されます。

これは、あなたが書いたクエリの意図であるように見えるでしょう:

SELECT COUNT(*) OVER() NO_OF_RECORDS, ROW_NUM 
FROM (SELECT A.ID, B.FirstName as FIRST_NAME, B.LastName as LAST_NAME, 
      MAX(B.CREATED_DATE) as CREATED_DATE, 
      ROW_NUMBER() OVER (ORDER BY MAX(CREATED_DATE) DESC) AS ROW_NUM 
     FROM SCHEMANAME.A A INNER JOIN 
      SCHEMANAME.B B 
      ON B.ShopperId = A.ShopperId LEFT OUTER JOIN 
      SCHEMANAME.C C 
      ON C.demographicId = B.demographicId 
     WHERE A.WritingTIN = 'XYZ' AND A.ParentTIN = 'XYZ' AND 
      B.State = 'OH' AND C.Status IN ('X', 'Y', 'Z') 
     GROUP BY A.ID, B.FirstName, B.LastName 
    ) ORDER_DETAILS 
WHERE ROW_NUM BETWEEN ((1*50)-50)+1 AND 1*50 
ORDER BY CREATED_DATE DESC; 

私は、この結果は理にかなっていることをわからないんだけど、それはあなたのエラーを修正する必要があります。

+0

返事をありがとう。クエリを簡略化するために、間違いに気付かなかった。私はGroupBy節を追加したことで、あなたが言及しているアプローチとはまだ異なる問題を抱えています。私はDb2の初心者です。あなたは、変更されたクエリをpls確認し、私はそれを修正し、解決策を説明するのに役立つ? – RVR