2017-11-27 1 views
0

Ich bin neu bei sql, wenn die Antwort offensichtlich ist, aber ich konnte sie nirgendwo finden. Also ich möchte die CategoryName, Beschreibung und den Durchschnittspreis der Produkte, die in der gleichen Kategorie sind. Unten ist das Bild der 2 Tabellen beteiligt. Das Problem ist die Beschreibung ich kann keinen Weg finden, es zu zeigen. (Es gibt 8 Kategorien und jede Kategorie hat 1 Beschreibung)Spalte ist in der Auswahlliste ungültig, da sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist. [Ntext]

Dies ist der Code die ich bisher gemacht haben, aber es hat den Fehler:

SELECT c.CategoryName,c.Description,avg(p.UnitPrice) 
FROM Categories AS c 
INNER JOIN Products AS p ON c.CategoryID=p.CategoryID 
GROUP BY c.CategoryName 

Der Fehler:

Column 'Categories.Description' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

Entschuldigung für mein schlechtes Englisch:/

+0

Der Fehler sagt Ihnen Ihr genaues Problem. Sie haben Beschreibung in der Liste neben auswählen, aber Sie haben es nicht in Ihrer Gruppe durch Klausel – Matt

+0

Ich habe das auch versucht, aber weil es Ntext heißt: Die Text, Ntext und Bild Datentypen können nicht verglichen oder sortiert werden, außer bei Verwendung IS NULL oder LIKE-Operator. –

+0

der Fehler über ntext und Dinge würde bedeuten, dass Sie nicht nach ihm gruppieren dürfen und es ist ein anderer Fehler. Aber lösen Sie es, indem Sie die Spalte in SELECT und GROUP BY in einen Datentyp umwandeln, den Sie aggregieren können, zB CAST (c.Description AS VARCHAR (???)) wo ??? ist eine akzeptable Länge oder verwenden Sie "MAX". – Matt

Antwort

0

(n)text kann nicht in Aggregat- oder Fensterfunktionen verwendet werden. Es ist auch seit SQL Server 2008 veraltet (wenn ich mich richtig erinnere, möglicherweise 2005). Sie sollten wirklich (n)varchar(MAX) verwenden.

Wenn Sie wirklich „haben“ (n)text dann verwenden Sie zuerst Ihr Aggregat tun müssen, und dann den Wert Ihrer (n)text Spalte abzurufen:

WITH Averages AS (
    SELECT p.CategoryID, avg(p.UnitPrice) AS AveragePrice 
    FROM p.CategoryID 
    GROUP BY p.CategoryID) 
SELECT C.CategoryName, C.Description, A.AveragePrice 
FROM Averages A 
    JOIN Categories C ON A.CategoryID = C.CategoryID; 

(Hinweis, dann ist dies nicht getestet aufgrund fehlender DDL- und Beispieldaten)

+0

Problem wurde in den Kommentaren gelöst, aber trotzdem danke! –

+2

@Larnu, ich bin mir nicht sicher, dass der Beitritt im CTE notwendig ist. – SQLCliff

+0

meinst du mit wo? Ich werde deine Antwort aber akzeptieren, weil es auch funktioniert. –

Verwandte Themen