2017-12-29 15 views
-4

Ich versuche, eine SQL-Abfrage mit einem GROUP BY Befehl ausführen, aber ich kann es nicht zum Arbeiten Ich versuchte, eine Aggregatfunktion zu verwenden, um das Problem zu beheben, aber ich denke, es ist ein besseres Möglichkeit, es korrekt auszuführen, ist meine SQL-Abfrage.SQL Fehler beim Ausführen einer Abfrage mit GROUP BY

SELECT TOP 100 cModel ,fdate, BoardSN 
FROM FovComp 
GROUP BY fdate ORDER BY CONVERT(datetime, fdate) DESC 

Der Fehler ist unter

Spalte ‚FovComp.cModel‘ ist ungültig in der Auswahlliste, weil sie nicht in einer Aggregatfunktion oder die GROUP BY-Klausel enthalten ist.

Ich möchte alle Spalten, aber es muss Gruppe von fdate Jeder Vorschlag wird groß sein.

+5

Der Fehler ist sehr klar, sollte eine schnelle Suche ermöglicht es Ihnen, es – HoneyBadger

+1

Zuerst zu lösen Bitte lassen Sie alle wissen, welches Ergebnis/welche Ausgabe Sie generieren möchten. Dann kann jeder versuchen, Ihr Problem zu lösen. Ihre Frage ist überhaupt nicht klar – maddy23285

+0

Also wird es eine Zeile in der Ausgabe für jeden eindeutigen Wert von "fdate" geben. Entsprechend diesen Werten kann jedoch eine beliebige Anzahl von verschiedenen "cModel" - und "BoardSN" -Werten vorliegen. Wie soll * wir * oder SQL Server * wissen, welcher Wert * aus denen ausgewählt werden soll, die in dieser einzelnen Ausgabezeile dargestellt werden sollen? –

Antwort

2

GROUP BY ist nützlich zum Zählen, Summieren oder Mittelung, aber Sie tun nichts davon. Und Sie müssen es tun, sonst macht GROUP BY keinen Sinn und ist nicht erlaubt.

Beispiel Nutzung:

SELECT fdate, COUNT(cModel) AS COUNT_cModel, COUNT(BoardSN) AS COUNT_BoardSN 
FROM FovComp 
GROUP BY fdate 
ORDER BY CONVERT(datetime, fdate) DESC 
+0

Danke für Ihre Antwort, aber ich möchte cModel COUNT COUNT und alle Spalten markieren und gruppieren von 'fdate', – Sarotobi

+0

Bitte bearbeiten Sie die Frage und fügen Sie einen repräsentativen Satz von Eingabedaten (10-15 Zeilen, mit etwa 2-4 verschiedenen 'fdate' Werte) + Ihre erwartete Ausgabe für diesen Datensatz. –

2

Wenn Sie für jedes Modell die neuesten Daten suchen, dann können Sie ein Ranking-Funktion diese verwenden tun:

WITH CTE 
AS 
(
    SELECT cModel ,fdate, BoardSN,CONVERT(datetime, fdate) AS fdate, 
    ROW_NUMBER() OVER(PARTITION BY cModel 
         ORDER BY CONVERT(datetime, fdate) DESC) AS RN 
    FROM FovComp 
) 
SELECT TOP 100 cModel ,fdate, BoardSN 
FROM CTE 
WHERE RN = 1 
ORDER BY fdate DESC; 

Auch, wenn Sie suchen die besten 100 pro Modell, können Sie WHERE RN <= 100

Ich möchte COmOD und COUNT alle Spalten und gro bis es durch fdate, dann können Sie dies tun:

WITH CTE 
AS 
(
    SELECT 
     fdate, 
     COUNT(cModel) AS ModelsCount 
    FROM FovComp 
    GROUP BY fdate 
) 
SELECT f.*, c.ModelsCount 
FROM FovComp AS f 
INNER JOIN CTE AS c ON f.fdate = c.fdate ; 
0

Ich glaube, Sie brauchen diese:

SELECT DISTINCT TOP 100 cModel ,fdate, BoardSN FROM FovComp ORDER BY CONVERT(datetime, fdate) DESC