2016-10-10 6 views
0

ich diesen Code bin versucht:Summe Sql Spalte mit beitreten

Select C.CustomerNum 
     , C.Coupon 
     , C.name 
     , C.Surname 
     , Sum(P.Points) 
From customers C 
Join Points P 
     On P.CustomerNum = C.CustomerNum 
Where C.Coupon = 'xxx-xxx-xxx-x'; 

Ich erhalte Fehler:

Msg 8118, Level 16, State 1, Line 1 Column 'C.CustomerNum' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

+0

Worauf soll SUM basieren? Der Fehler ist selbsterklärend – techspider

+0

Zum Erhalten meiner Gesamtpunkte in derselben Zeile – user6927546

+0

Mögliches Duplikat von [Grund für Spalte ist in der Auswahlliste ungültig, da es weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist] (http: // Paketüberfluss.com/questions/13999817/reason-for-column-is-invalid-in-the-select-Liste-weil-es-ist-nicht-enthalten-in-e) – techspider

Antwort

0

Wenn Sie ein Aggregat (SUM, COUNT, AVERAGE) haben, müssen Sie Ihre Abfrage nach allen zurückgegebenen Nicht-Aggregatspalten gruppieren. Dazu:

Select C.CustomerNum 
     , C.Coupon 
     , C.name 
     , C.Surname 
     , Sum(P.Points) 
From customers C 
Join Points P 
     On P.CustomerNum = C.CustomerNum 
Where C.Coupon = 'xxx-xxx-xxx-x'; 
Group By C.CustomerNum 
     , C.Coupon 
     , C.name 
     , C.Surname 
0

Die Fehlermeldung es legt. Sie können dies tun (ohne Gruppe nur Aggregate auswählen, indem):

Select Sum(P.Points) 
From customers C 
Join Points P 
     On P.CustomerNum = C.CustomerNum 
Where C.Coupon = 'xxx-xxx-xxx-x'; 

oder diese (wählen Aggregat und Spalten, wenn Spalten in der Gruppe sind von):

Select C.CustomerNum 
     , Sum(P.Points) 
From customers C 
Join Points P 
     On P.CustomerNum = C.CustomerNum 
Where C.Coupon = 'xxx-xxx-xxx-x' 
group by c.customernum 

aber nicht diese (wählen Aggregate und Spalten ohne eine Gruppe von):

Select C.CustomerNum 
     , C.Coupon 
     , C.name 
     , C.Surname 
     , Sum(P.Points) 
From customers C 
Join Points P 
     On P.CustomerNum = C.CustomerNum 
Where C.Coupon = 'xxx-xxx-xxx-x'; 
+0

Funktioniert nicht der zweite Fall, weder ich nehme die gleiche Fehlermeldung – user6927546

+0

Ich habe nicht hinzugefügt, was Ihre Abfrage sein sollte. Ich versuche nur, die Fehlermeldung zu erklären. Überprüfen Sie die Antwort einer anderen Person auf eine Kopier-/Pastenlösung. – Malk

0

Wenn eine Aggregatfunktion verwenden, müssen Sie ein GROUP BY verwenden. Versuchen Sie dies:

Select C.CustomerNum 
     , C.Coupon 
     , C.name 
     , C.Surname 
     , Sum(P.Points) 
From customers C 
Join Points P 
     On P.CustomerNum = C.CustomerNum 
Where C.Coupon = 'xxx-xxx-xxx-x'; 
GROUP BY C.CustomerNum 
     , C.Coupon 
     , C.name 
     , C.Surname 

Jetzt werden Sie wahrscheinlich eingrenzen möchten, was Sie tatsächlich auswählen möchten. Zum Beispiel könnte es am besten sein, nur nach C.Surname oder C.CustomerNum zu gruppieren.

+0

Danke, es funktioniert – user6927546

0

Sie können keine Aggregatfunktion (in diesem Fall SUM()) mit anderen nicht aggregierten Spalten ohne GROUP BY zu verwenden verwenden. Allerdings können Sie es tun, indem sie diese eine Fenster SUM() Funktion:

Select C.CustomerNum 
     , C.Coupon 
     , C.name 
     , C.Surname 
     , Sum(P.Points) Over (Partition By C.CustomerNum) 
From customers C 
Join Points P 
     On P.CustomerNum = C.CustomerNum 
Where C.Coupon = 'xxx-xxx-xxx-x'; 

Aber vielleicht sind Sie gruppieren wollen sie durch die CustomerNum, Coupon, Name und Surname, wobei in diesem Fall müssen Sie nur hinzufügen a:

Select C.CustomerNum 
     , C.Coupon 
     , C.name 
     , C.Surname 
     , Sum(P.Points) 
From customers C 
Join Points P 
     On P.CustomerNum = C.CustomerNum 
Where C.Coupon = 'xxx-xxx-xxx-x' 
Group By C.CustomerNum, C.Coupon, C.Name, C.Surname 
1

Sie können auch verwenden.

SELECT C.CustomerNum, 
     C.Coupon, 
     C.name, 
     C.Surname, 
     P.Points 
FROM customers C 
     INNER JOIN (SELECT Sum(Points) AS Points, 
            CustomerNum 
        FROM Points 
        GROUP BY CustomerNum) P 
     ON P.CustomerNum = C.CustomerNum 
WHERE C.Coupon = 'xxx-xxx-xxx-x'; 

Um zu vermeiden, alle ausgewählten Spalten von customers auf die GROUP BY Liste hinzuzufügen.

0

@ User6927546

Wenn Sie MySQL verwenden, als es sollte arbeiten, weil ich Kreuz haben geprüft gleiche und seine adaequat.

wählen employee.empId, employee.Name, sum (w.workcode) aus Mitarbeiter kommen Werke w auf employee.workId = w.id wo employee.Name = 'anoop'

ich das Ergebnis Set erhalten wie: empId Name Summe (w.workcode) 1 Anoop 200