Wie kann man mehrere Spalten auswählen, aber nur nach einer gruppieren?


14

Ich habe ein Problem mit group by. Ich möchte mehrere Spalten auswählen, aber nur nach einer Spalte gruppieren. Die folgende Abfrage ist das, was ich versucht habe, aber es gab mir einen Fehler.

SELECT Rls.RoleName,Pro.[FirstName],Pro.[LastName],Count(UR.[RoleId]) as [Count]
from [b.website-sitecore-core].[dbo].[aspnet_UsersInRoles] UR
inner join [b.website-professional-au].[dbo].[Profile]  Pro
on UR.UserId = Pro.Id
inner join [b.website-sitecore-core].[dbo].[aspnet_Roles] Rls
on Rls.RoleId = UR.RoleId
inner join [b.website-professional-au].[dbo].[Gender] Gn
on gn.Id = pro.GenderId
GROUP BY Rls.RoleName;

Antworten:


19

In SQL Server können Sie nur Spalten auswählen, die Teil der GROUP BYKlausel sind, oder Funktionen für eine der anderen Spalten aggregieren. Ich habe darüber hier ausführlich gebloggt . Sie haben also zwei Möglichkeiten:

  1. Fügen Sie der GROUP BYKlausel die zusätzlichen Spalten hinzu :

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. Fügen Sie einige Aggregatfunktionen für die relevanten Spalten hinzu:

    SELECT Rls.RoleName, MAX(Pro.[FirstName]), MAX(Pro.[LastName])

Die zweite Lösung ist meist eine Problemumgehung und ein Hinweis darauf, dass Sie mit Ihrer Abfrage etwas Allgemeineres korrigieren sollten.


"In SQL Server können Sie nur Spalten auswählen, die Teil der GROUP BY-Klausel sind, oder Aggregatfunktionen für eine der anderen Spalten ..." habe ich gesucht. Thnx
Irfan

HINWEIS: Diese beiden Optionen können absolut FALSCHE Ergebnisse liefern! GROUP BY A,B,Ckann völlig anders sein als das, was Sie im Vergleich zu bekommen wollen GROUP BY A. Außerdem können wir normalerweise keine Aggregatfunktion verwenden, um den zugehörigen Spaltenwert abzurufen. Überprüfe diese Antwort als Lösung
S.Serpooshan

2

Hinweis: Diese Antwort ist als Ergänzung zur Antwort von @Lukas Eder gedacht

Wenn für die Felder SELECTed mehrere Werte vorhanden sind, aber ein Feld, das Sie möchten, GROUP BYkönnen Sie stattdessen die oberste übereinstimmende Zeile abrufen, anstatt MAXauf die Rückgabe einer Aggregation ( ) zu warten .

SELECT i.RoleName, i.*
FROM Rls JOIN 
(SELECT TOP 1 R.Rolename, Pro.FirstName, Pro.LastName FROM Rls as R JOIN Pro ON ... ) as i
     ON i.Rolename=Rls.RoleName

Wenn Sie möchten, dass ALLE Werte in diesen anderen Spalten zurückgegeben werden, diese jedoch zu einem einzigen Eintrag zusammengefasst werden, lesen Sie: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-sql /

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.