2017-02-21 2 views
0

Kann mir jemand helfen zu verstehen, was mit dieser Db2-Abfragesyntax falsch ist, schlägt es mit SQLCODE -120 fehl, weil ich versuche, row_number() zu verwenden?DB2 - Ungültige Verwendung einer Aggregatfunktion 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 

Fehler angezeigt: Ungültige Verwendung einer Aggregatfunktion oder OLAP-Funktion .. SQLCODE = -120, SQLSTATE = 42903, DRIVER = 4.18.60

+0

Wenn LEFT JOIN, setzen Sie die Bedingungen der rechten Seitentabelle in die ON-Klausel, um echtes LINKES JOIN-Verhalten zu erhalten. (Wenn Sie in WHERE, erhalten Sie regelmäßige innere Join-Ergebnis ...) – jarlh

+0

@ Jarlh Problem ist nicht wegen Join .. es ist aufgrund der falschen Verwendung von Aggregat-Funktion .. ich habe gerade die Abfrage zur Vereinfachung geändert. Fehler: Ungültige Verwendung einer Aggregatfunktion oder OLAP-Funktion. SQLCODE = -120, SQLSTATE = 42903 – RVR

+0

Mein Kommentar war nicht dazu gedacht, das Problem zu lösen, sondern nur, um Joins zu verbessern. – jarlh

Antwort

0

Sie haben mehrere Fehler:

  • X ist in der Unterabfrage nicht definiert.
  • B.CREATED_DATE wird in der äußeren Abfrage referenziert, aber es ist nicht definiert.
  • ROW_NUMBER() wird in der WHERE Klausel verwendet.

Dies scheint die Absicht der Abfrage zu sein, schreiben Sie:

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; 

Ich bin nicht sicher, dass dieses Ergebnis Sinn macht, aber es sollte Ihre Fehler beheben.

+0

danke für die Antwort. Um die Abfrage zu vereinfachen, verpasst, um die Fehler zu bemerken. Ich bekomme immer noch andere Probleme mit dem Ansatz, den Sie aufgrund der Hinzufügung der GroupBy-Klausel erwähnen. Ich bin neu bei DB2. Können Sie bitte die modifizierte Abfrage überprüfen und mir helfen, das zu beheben und die Lösung zu erklären? – RVR

Verwandte Themen