2017-08-04 4 views
0

Ich schreibe eine gespeicherte Prozedur. Die gespeicherte Prozedur nimmt Inventar für alle Inventareinträge auf und gibt unter anderem die Gesamtkosten für alle Einheiten dieses Produkts zurück. Ich bin Gruppierung von Produkt- und Lieferanteninformationen, dann, wenn es um die Menge und den Wert kommt habe ich dieseMultiplikation in Summe

SELECT i.SupplierID, i.SupplierName, p.ProductID, p.ProductName, 
     SUM(i.Quantity) AS Quantity, 
     SUM(i.Quantity * i.UnitCost) AS TotalValue, 
     SUM(i.Quantity * i.UnitCost) OVER() AS AllProductsTotal 
FROM Inventory i 
JOIN Products p on p.ProductID = i.ProductID 
GROUP BY i.SupplierID, i.SupplierName, p.ProductID, p.ProductName 

aber wenn ich versuche, das schaffen ...

Msg 8120 zu laufen, Ebene 16 , Status 1, Zeile 2

Die Spalte 'Inventory.Quantity' ist in der Auswahlliste ungültig, da sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist.

Msg 8120, Ebene 16, Status 1, Zeile 2

Spalte 'Inventory.UnitCost' ist ungültig in der Auswahlliste, weil sie nicht in einer Aggregatfunktion oder die GROUP BY-Klausel enthalten ist.

Die Säulen sind in einem Aggregat, und nur in einem Aggregat, sie sind einfach im gleichen Aggregat zusammen. Was mache ich falsch?

+0

Sollte „ie.ProductID“ sein „anwenden möchten i.ProductID "? in der Verbindung? – rjdevereux

+2

'SUM() OVER()' ist kein Aggregat – Serg

+0

als @Serg sagte und auch nicht das gewünschte Ergebnis zurückgeben. Sie benötigen eine Unterabfrage oder eine andere 'JOIN' –

Antwort

1

Wenn ich es richtig verstanden habe, können Sie eine Fensterfunktion auf ein Aggregat

SELECT i.SupplierID, i.SupplierName, p.ProductID, p.ProductName, 
     SUM(i.Quantity) AS Quantity, 
     SUM(i.Quantity * i.UnitCost) AS TotalValue, 
     SUM(SUM(i.Quantity * i.UnitCost)) OVER() AS AllProductsTotal 
FROM Inventory i 
JOIN Products p on p.ProductID = ie.ProductID 
GROUP BY i.SupplierID, i.SupplierName, p.ProductID, p.ProductName 
+0

Ohne Partitionierung. Die Prozedur muss auch die Summe aller Zeilen zurückgeben. Dies ist die Fensterfunktion, der Gesamtwert aller Produkte im Inventar. – Andrew

+0

Partitionierung wurde entfernt. Ich habe "die Gesamtkosten für alle Einheiten dieses Produkts" als Anforderung für die Aufteilung nach Produkt falsch gelesen. – Serg

0

Sie können Code ändern, wie unten


Select *, Sum(TotalValue) as AllProductsTotal over() 
from (
    SELECT i.SupplierID, i.SupplierName, p.ProductID, p.ProductName, 
     SUM(i.Quantity) AS Quantity, 
     SUM(i.Quantity * i.UnitCost) AS TotalValue--, 
     --SUM(i.Quantity * i.UnitCost) OVER() AS AllProductsTotal 
    FROM Inventory i 
    JOIN Products p on p.ProductID = ie.ProductID 
    GROUP BY i.SupplierID, i.SupplierName, p.ProductID, p.ProductName 
) a 
+0

Ja Ich könnte sicherlich einen Teil der erforderlichen Rückkehr entfernen, um es zum Arbeiten zu bringen, aber dann fehlen mir zwei Werte für den Bericht, den dieser Prozess erzeugt. – Andrew

+0

Nicht in der Lage, Ihren Kommentar zu verstehen .. –

+0

Vergesse ich Ihre Antwort falsch gelesen, habe ich nicht aus dem Subselect auswählen, obwohl ich denke, die Reihenfolge soll vor dem Alias ​​nicht nach. – Andrew