2017-02-21 166 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 

ERROR圖所示:無效的使用聚合函數或OLAP功能的.. SQLCODE = -120,SQLSTATE = 42903,DRIVER = 60年4月18日

+0

當LEFT JOIN時,在ON子句中放置右側表條件以獲得真正的LEFT JOIN行爲。 (在WHERE中,你會得到常規的內部連接結果...) – jarlh

+0

@jarlh問題不是由於加入..這是由於聚合函數的錯誤用法..我剛剛改變了查詢爲簡單起見。錯誤:集合函數或OLAP函數的使用無效.. 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的新手。你能否請檢查修改後的查詢,並幫助我解決這個問題,並解釋解決方案? – RVR