2016-12-19 3 views
0

Ich möchte den Kundennamen anzeigen, wenn der Gesamtpreis höher als der Durchschnittspreis jeder Transaktion ist. Aber die Fehlermeldung lautet "Spalte 'x.average' ist in der HAVING-Klausel ungültig, da sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist." und ich weiß nicht, wo die Probleme sind.Wie wird der Kundenname für jede Transaktion angezeigt, deren Gesamtpreis höher ist als der Durchschnittspreis?

Hier ist mein Code

SELECT c.CustomerId, 
     hs.TransactionId, 
     c.CustomerName, 
     SUM(t.Price) AS [Total Price] 
FROM MsCustomer c JOIN HeaderSalonServices hs 
ON c.CustomerId = hs.CustomerId 
JOIN DetailSalonServices ds 
ON ds.TransactionId = hs.TransactionId 
JOIN MsTreatment t 
ON t.TreatmentId = ds.TreatmentId, 
(SELECT AVG(Price) AS average 
FROM MsTreatment) AS x 
GROUP BY c.CustomerId, hs.TransactionId, c.CustomerName 
HAVING SUM(t.Price) > average 
+0

Durchschnitt nur innerhalb der Unterabfrage definiert ist, sondern nur Ihre umbenannt in "x" verwenden. ;-) – flowtron

+0

Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple -SQL-Abfrage – Strawberry

Antwort

1

Versuchen Sie, Ihre Unterabfrage der HAVING-Klausel zu bewegen:

SELECT c.CustomerId, 
     hs.TransactionId, 
     c.CustomerName, 
     SUM(t.Price) AS [Total Price] 
FROM MsCustomer c JOIN HeaderSalonServices hs 
ON c.CustomerId = hs.CustomerId 
JOIN DetailSalonServices ds 
ON ds.TransactionId = hs.TransactionId 
JOIN MsTreatment t 
ON t.TreatmentId = ds.TreatmentId 
GROUP BY c.CustomerId, hs.TransactionId, c.CustomerName 
HAVING SUM(t.Price) > (SELECT AVG(Price) AS average FROM MsTreatment) 
Verwandte Themen