Comment sélectionner plusieurs colonnes mais seulement les grouper par une?

14

J'ai un problème avec group by, je souhaite sélectionner plusieurs colonnes mais les regrouper par une seule colonne. La requête ci-dessous est ce que j'ai essayé, mais elle m'a donné une erreur.

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
la source

Réponses:

19

Dans SQL Server, vous ne pouvez sélectionner que des colonnes faisant partie de la GROUP BYclause ou agréger des fonctions sur l'une des autres colonnes. J'ai blogué à ce sujet en détail ici . Vous avez donc deux options:

  1. Ajoutez les colonnes supplémentaires à la GROUP BYclause:

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. Ajoutez une fonction d'agrégation sur les colonnes pertinentes:

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

La deuxième solution est principalement une solution de contournement et une indication que vous devez corriger quelque chose de plus général avec votre requête.

Lukas Eder
la source
"Dans SQL Server, vous ne pouvez sélectionner que des colonnes qui font partie de la clause GROUP BY, ou des fonctions d'agrégation sur l'une des autres colonnes ..." est quelque chose que je cherchais. Thnx
Irfan
REMARQUE: ces deux options peuvent fournir des résultats absolument faux! GROUP BY A,B,Cpeut être totalement différent de ce que vous souhaitez obtenir par rapport à GROUP BY A. et aussi, généralement, nous ne pouvons pas utiliser une fonction d'agrégation pour obtenir la valeur de colonne associée. vérifier cette réponse comme une solution
S.Serpooshan
2

Remarque: Cette réponse est destinée à compléter la réponse de @Lukas Eder

S'il y a plusieurs valeurs présentes pour les champs SELECTéd mais un champ que vous souhaitez GROUP BY, vous pouvez plutôt saisir la ligne de correspondance supérieure, plutôt que d'attendre le retour d'une agrégation ( MAX).

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

si vous voulez que TOUTES les valeurs retournent dans ces autres colonnes, mais que vous vouliez la réduire à une seule entrée, voir: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-sql /

mpag
la source