¿Cómo seleccionar varias columnas pero solo agruparlas por una?

14

Tengo un problema con group by, quiero seleccionar varias columnas pero agruparlas solo por una columna. La consulta a continuación es lo que intenté, pero me dio un error.

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
fuente

Respuestas:

19

En SQL Server solo puede seleccionar columnas que formen parte de la GROUP BYcláusula o agregar funciones en cualquiera de las otras columnas. He blogueado sobre esto en detalle aquí . Así que tienes dos opciones:

  1. Agregue las columnas adicionales a la GROUP BYcláusula:

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. Agregue alguna función agregada en las columnas relevantes:

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

La segunda solución es principalmente una solución alternativa y una indicación de que debe solucionar algo más general con su consulta.

Lukas Eder
fuente
"En SQL Server solo puede seleccionar columnas que forman parte de la cláusula GROUP BY, o agregar funciones en cualquiera de las otras columnas ..." es algo que estaba buscando. Thnx
Irfan
NOTA: ¡estas dos opciones pueden proporcionar resultados absolutamente INCORRECTOS! GROUP BY A,B,Cpuede ser totalmente diferente de lo que quieres obtener en comparación GROUP BY A. y también, generalmente no podemos usar alguna función agregada para obtener un valor de columna relacionado. marque esta respuesta como una solución
S.Serpooshan
2

Nota: Esta respuesta pretende ser un complemento de la respuesta de @Lukas Eder

Si hay varios valores presentes para los campos SELECTed pero un campo que desea GROUP BY, en su lugar, puede tomar la línea de coincidencia superior, en lugar de esperar MAXa que regrese una agregación ( ).

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 desea que TODOS los valores vuelvan en esas otras columnas, pero desea contraerlo en una sola entrada, consulte: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-sql /

mpag
fuente