2016-12-09 2 views
-1

Ich bin neu in SQL. Könnte mir jemand helfen, herauszufinden, warum der Ausdruck "Gruppieren nach" in dieser SQL-Abfrage nicht funktioniert? Ich erhalte diesen FehlerGruppieren nach Ausdruck funktioniert nicht in dieser SQL-Abfrage?

ERROR at line 3: 
ORA-00979: not a GROUP BY expression 

Der Code ich verwende ist

CREATE OR REPLACE VIEW CUSTOMER_LINE_ITEM AS 
SELECT CUSTOMER_ORDER_CART_INFO.loginName,CUSTOMER_ORDER_CART_INFO.FirstName, 
CUSTOMER_ORDER_CART_INFO.LastName,CUSTOMER_ORDER_CART_INFO.orderCartID,(lineItems.orderPrice*lineItems.qtyOrdered) AS TOTAL_ORDER 
FROM CUSTOMER_ORDER_CART_INFO 
INNER JOIN lineItems 
ON CUSTOMER_ORDER_CART_INFO.orderCartID = lineItems.orderCartID 
GROUP BY CUSTOMER_ORDER_CART_INFO.loginName,CUSTOMER_ORDER_CART_INFO.FirstName, 
CUSTOMER_ORDER_CART_INFO.LastName,CUSTOMER_ORDER_CART_INFO.orderCartID 
ORDER BY orderCartID; 

Ohne die Gruppe von Ausdruck, den ich diese Ansicht zu erzeugen. Ich denke die Gruppe von Ausdruck sollte nur die Duplikate entfernen und mir nur die Ergebnisse mit verschiedenen Bestellwagen ID geben. Kann mir jemand helfen zu verstehen, was ich hier falsch mache? VIEW of CUSTOMER_LINE_ITEM without 'group by'

+0

Ich schlage vor, TOTAL_ORDER zum Ausdruck GROUP BY hinzuzufügen, da ich denke, dieser Fehler zeigt an, dass nicht alle Spalten in der Auswahlliste auch gruppiert nach Ausdruck sind - aber nicht ausprobiert haben. – Dilettant

+0

Haben Sie versucht [suchen] (http://stackoverflow.com/search?q=oracle+not+a+group+by)? – Aleksej

+1

Mögliches Duplikat von [ORA-00979 keine Gruppe nach Ausdruck] (http://stackoverflow.com/questions/1520608/ora-00979-not-a-group-by-expression) – Aleksej

Antwort

0

Der Fehler ist mit der Gruppierung nach Klausel. Erinnern Sie sich an die einfache Faustregel, dass alle Spalten ausgewählt werden müssen, um in einer group by -Klausel zu sein, oder die auszuwählenden Spalten, die nicht Teil der group by -Klausel sind, als eine Aggregatfunktion wie MAX, MIN, SUM, AVG ausgewählt werden. usw.

Versuchen Sie die folgende Abfrage, die ohne Problem ausgeführt werden würde. Aber ich kann nicht seine logische Korrektheit sagen, die Sie auf Ihrer Anforderungsbasis herausfinden müssen.

CREATE OR REPLACE VIEW customer_line_item AS 
    SELECT cac.loginName, 
      cac.FirstName, 
      cac.LastName, 
      cac.orderCartID, 
      (SUM(li.orderPrice) * SUM(li.qtyOrdered)) AS TOTAL_ORDER 
     FROM customer_order_cart_info cac 
    INNER JOIN lineItems li 
     ON cac.orderCartID = li.orderCartID 
    GROUP BY cac.loginName, 
       cac.FirstName, 
       cac.LastName, 
       cac.orderCartID 
    ORDER BY cac.orderCartID; 

Sache Jetzt ist hier zu beachten, li.orderPrice und li.qtyOrdered ausgewählt wurden, waren aber weder in Gruppe noch in einer Aggregatfunktion. Die Verwendung von group by besteht darin, dass die Spalten in der group by-Klausel zum logischen Gruppieren Ihrer Daten verwendet werden. Hier sind Ihre Daten gruppiert nach LoginName, Vorname, Nachname, Ordercartid. Es gibt jedoch eine Wahrscheinlichkeit, dass mehrere Bestellpreise und Mengen für jede Gruppe existieren, und SQL ist dann nicht in der Lage, die Gruppierungslogik zu rechtfertigen. Nach Ihrer Anfrage eine Anforderung, die ich mir vorstellen konnte, war, dass Sie den Gesamtwert der Bestellung für einen Kunden in seinem Warenkorb finden möchten. Daher multiplizieren Sie OrderPrice mit QtyOrdered. Um dies zu erreichen, müssen Sie den Auftragspreis und die Auftragsmenge jedes Linienelements multiplizieren. Also, was Sie brauchen, ist eine Summe von (orderPrice * orderQty) Gruppe von lineItem (lineItemID/lineItemNo vielleicht, nur eine Schätzung). Gib mir für diese eine Zeit, lass mich ein Beispiel entwickeln und ich werde meine Antwort damit bearbeiten. Bis dann versuchst du etwas wie oben.

+0

Ich denke zu spät. Sowieso :) –

1

Die Ursache der Fehlermeldung ist, dass Sie nicht aggregieren (lineItems.orderPrice*lineItems.qtyOrdered).

Die Oracle documentation sagt uns

SelectItems im SelectExpression mit einer GROUP BY-Klausel muss enthalten nur aggregiert oder Spalten zu gruppieren.

Das bedeutet, dass Sie TOTAL_ORDER z.

sum(lineItems.orderPrice*lineItems.qtyOrdered) 

oder was auch immer die Anforderung ist.

+1

Vielen Dank .. Es hat funktioniert! Ich verstehe, was schief gelaufen ist. –