2017-11-30 1 views
1

Ich habe eine Tabelle wie folgt aus:meine benutzerdefinierte Ansicht erstellen in SQL

  • UserName nvarchar(50) (Primärschlüssel)
  • FieldId nvarchar(50) (Primärschlüssel)
  • AvgScore float

Wenn ich erstellen möchten eine Ansicht, die mir zeigt "Was ist Max von AvgScore für jeden Benutzernamen.", kann es leicht wie folgt erstellt werden:

SELECT 
    UserName, MAX(AvgScore) AS MaxAvgScore 
FROM 
    dbo.tblUsersFields 
GROUP BY 
    UserName 

Aber ich möchte sicher FieldId bezogen auf MaxAvgScore. Ich habe es versucht:

SELECT 
    UserName, FieldId, MAX(AvgScore) AS MaxAvgScore 
FROM  
    dbo.tblUsersFields 
GROUP BY 
    UserName 

Aber das funktioniert nicht. Diese Fehlerursache:

Was kann ich tun?

+0

Fügen Sie einige Beispieltabellendaten und das erwartete Ergebnis hinzu. – jarlh

+1

Die allgemeine GROUP BY-Regel lautet: Wenn eine GROUP BY-Klausel angegeben ist, muss jede Spaltenreferenz in der SELECT-Liste entweder eine Gruppierungsspalte angeben oder das Argument einer set-Funktion sein. Versuchen Sie 'GROUP BY UserName, FieldId'. – jarlh

+1

Sie müssen entweder die 'FeldID'-Spalte (sum/avg/max/usw.) aggregieren oder sie der' group by' -Klausel hinzufügen ('... Gruppe nach UserName, FieldID') – tarheel

Antwort

0

Durch dank @JNevill, verbessere ich seine Antwort als endgültige Antwort: (Siehe die Antwort des @ JNevill und der damit verbundenen Kommentare.)

SELECT t1.UserName, MIN(DISTINCT t2.FieldId) AS FieldId2, t1.MaxAvgScore 
FROM 
(SELECT UserName, MAX(AvgScore) AS MaxAvgScore 
FROM dbo.tblUsersFields 
GROUP BY UserName) AS t1 
INNER JOIN dbo.tblUsersFields AS t2 ON 
t1.UserName = t2.UserName AND t1.MaxAvgScore = t2.AvgScore 
GROUP BY t1.UserName, t1.MaxAvgScore 
0

Sie müssen alle nicht aggregierten Funktionsspalten in Ihrer GROUP BY-Klausel angeben.

+0

Dank @Dessma. Aber in meiner Tabelle kann jeder 'UserName' mehrere' FieldId' haben und wenn ich 'GROUP BYNutzername, FieldId' verwende, werden alle Kombinationen von' UserName' und 'FieldId' angezeigt, während ich nur eine Zeile für jeden' ​​'brauche UserName', der die zugehörige 'FieldId' spezifiziert. –

0

In SQL können Sie nur Spalten adressieren, die Teil der GROUP BY-Anweisung oder als Parameter für eine aggregate-Funktion sind.

Statt

GROUP BY UserName 

Schreib

GROUP BY UserName, FieldId 

Wenn Sie alternatinv FieldIds für den gleichen Benutzernamen haben, müssen Sie so etwas wie:

SELECT t1.*, t2.FieldId FROM (
SELECT UserName, MAX(AvgScore) FROM tblUsersFields GROUP BY UserName) t1 
LEFT JOIN tblUsersFields t2 ON t2.UserName = t1.UserName 

Dies gibt Ihnen eine Zeile pro FeldId.

+0

Danke @Olaf Watteroth. Aber dieser Code zeigt alle Daten wie 'GROUP BY UserName, FieldId'. –

1

zuerst den max bekommen (avgscore) für jeden Benutzer:

SELECT username, max(avgscore) as maxavgscore) 
FROM dbo.tblUserFields 
GROUP BY Username 

Jetzt können wir dieses Ergebnis kommen in Ihren tblUserfields Tisch zurück, um die FieldID zu erhalten, die zu dieser einzigartigen Username, MaxAvgScore Kombination entspricht mit einer INNER JOIN:

SELECT t1.username, t2.FieldID, t1.maxavgscore 
FROM 
    (
     SELECT username, max(avgscore) as maxavgscore 
     FROM dbo.tblUserFields 
     GROUP BY Username 
    ) t1 
    INNER JOIN dbo.tblUserFields t2 ON 
     t1.username = t2.username 
     AND t1.maxavgscore = t2.avgscore 
+0

Danke @JNevill. Das ist großartig. Wenn jedoch zwei Punkte den MaxScore in der Tabelle erreicht haben, zeigt dieser Befehl beide an. Was kann ich für diesen Fall tun? –

+0

Sehr geehrte @ JNevill, wenn ich 'MIN (DISTINCT t2.FieldId) AS FieldId2' anstelle von' t2.FieldId' und setzen Sie GROUP BY t1.UserName, t1.MaxAvgScore' am Ende Ihres Codes, Problem ist gelöst. Danke vielmals. –

Verwandte Themen