2017-11-18 1 views
-1

Ich habe den folgenden Code, der 7 Zeilen hat. Ich möchte avg, min, max der Produktnamen Spalte, die die gleichen sind (zum Beispiel: Ich habe 3 Produkte mit einem Namen von "Schuhe", die gleich sind und ihre Kosten sind 50, 45, 60. Ich habe ein Produkt Benannt 'Hat' mit einem Preis von 50. Jetzt möchte ich Durchschnitt von 3 gemeinsamen Zeilen nehmen, dh 50, 45, 60 und es sollte 51,66 angezeigt werden.Für die andere Zeile sollte 50 usw. angezeigt werden)Wie Aggregatfunktion zu verwenden, wenn wir Aggregat bestimmter Zeilen in SQL Server 2014 benötigen

Mein Problem ist, wenn ich unter Abfrage ausführen, zeigen Sie die avg, max, min der gleichen Zeile anstelle von avg, min, max der Zeilen, die gleich sind.

SELECT 
    PRODUCT.ProductName, 
    Vendor.VendorName, VendorProduct.Cost, 
    AVG(COST) AS AVG, 
    MIN(COST) AS MIN, 
    MAX(COST) AS MAX 
FROM 
    PRODUCT 
JOIN 
    VendorProduct ON VendorProduct.ProductID = PRODUCT.ProductID 
JOIN 
    Vendor ON Vendor.VendorID = VendorProduct.VendorID 
GROUP BY 
    PRODUCT.ProductName, VendorProduct.Cost, Vendor.VendorName 

Jede Hilfe wird geschätzt.

+1

Aktualisierung Ihrer Frage eine richtige Datenprobe hinzufügen pikiert und das erwartete Ergebnis – scaisEdge

+2

Bearbeiten Sie Ihre Frage und Beispieldaten zur Verfügung stellen und die gewünschte Ergebnisse. –

+1

Bitte entscheiden Sie, ob es sich bei Ihrer Frage um MySQL oder SQL Server handelt, die Antworten sind davon abhängig –

Antwort

1

Ich vermute, dass Sie wollen:

SELECT p.ProductName, 
     AVG(vp.COST) AS AVG, MIN(vp.COST) AS MIN, MAX(vp.COST) AS MAX 
FROM PRODUCT p join 
    VendorProduct vp 
    on vp.ProductID = p.ProductID 
GROUP BY p.ProductName; 

Hinweise:

  • ich alle Spaltennamen Abkürzungen für die Tabelle qualifiziert haben, verwenden.
  • Ich habe den Lieferantennamen aus dem SELECT entfernt, weil Sie die Durchschnitte nach Produkt möchten.
  • Ich habe den Hersteller und Preis aus dem gleichen Grund aus dem GROUP BY entfernt.
  • AVG, MIN und MAX sind schlechte Namen für Spalten, da dies SQL-Schlüsselwörter sind.
1

ändern

AVG(cost) as avg 

Um

AVG(cost) OVER(PARTITION BY productname) as [avg] 

Machen Sie die gleiche Änderung (Hinzufügen einer Klausel OVER) zu den anderen Aggregaten und auch die GROUP BY-Linie ganz

Dieses entfernen gibt Ihnen die gleiche Anzahl an Zeilen, die Sie jetzt erhalten, aber die Aggregate wiederholen sich für jeden identischen Wert von Produktname. Sie erhalten auch die Anbieterdetails

Was ist das? In SQL heißt es eine Fensterfunktion; eine Möglichkeit, einen Datensatz zu gruppieren und die gruppierten Ergebnisse implizit mit den Detailzeilen zu verbinden, ohne die Details der Detailzeilen zu verlieren. MSDN wird eine Menge zu sagen über sie haben, wenn Ihre Neugier

Hinweis, Gordon Rat re Spalte Benennung