Jak wybrać wiele kolumn, ale pogrupować tylko jedną?

14

Mam problem group by, chcę wybrać wiele kolumn, ale pogrupować według tylko jednej kolumny. Poniższe zapytanie jest tym, co próbowałem, ale dał mi błąd.

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;
Nayeem Mansoori
źródło

Odpowiedzi:

19

W SQL Server można wybierać tylko kolumny, które są częścią GROUP BYklauzuli, lub agregować funkcje w dowolnej innej kolumnie. Szczegółowo o tym blogowałem tutaj . Masz więc dwie opcje:

  1. Dodaj dodatkowe kolumny do GROUP BYklauzuli:

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. Dodaj funkcję agregującą do odpowiednich kolumn:

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

Drugie rozwiązanie jest głównie obejściem i wskazówką, że powinieneś naprawić coś bardziej ogólnego w swoim zapytaniu.

Lukas Eder
źródło
„W SQL Server można tylko wybierać kolumny, które są częścią klauzuli GROUP BY, lub agregować funkcje w dowolnej innej kolumnie ...” to było to, czego szukałem. Thnx
Irfan
UWAGA: te dwie opcje mogą zapewnić absolutnie NIEWŁAŚCIWE wyniki! GROUP BY A,B,Cmoże być zupełnie inny niż to, co chcesz uzyskać w porównaniu GROUP BY A. a także zwykle nie możemy użyć funkcji agregującej, aby uzyskać powiązaną wartość kolumny. sprawdź tę odpowiedź jako rozwiązanie
S.Serpooshan,
2

Uwaga: Ta odpowiedź stanowi uzupełnienie odpowiedzi @Lukas Eder

Jeśli istnieje wiele wartości dla pól SELECTed, ale pole, które chcesz GROUP BY, możesz zamiast tego pobrać górną pasującą linię, zamiast czekać na MAXzwrócenie agregacji ( ).

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

jeśli chcesz, aby WSZYSTKIE wartości zwracały się w tych innych kolumnach, ale chcesz zwinąć je w jednym wpisie, patrz: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-sql /

mpag
źródło