Como selecionar várias colunas, mas apenas agrupar por uma?

14

Estou com um problema group by, quero selecionar várias colunas, mas agrupar por apenas uma coluna. A consulta abaixo é o que tentei, mas ocorreu um erro.

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
fonte

Respostas:

19

No SQL Server, você pode selecionar apenas as colunas que fazem parte da GROUP BYcláusula ou agregar funções em qualquer uma das outras colunas. Eu escrevi sobre isso em detalhes aqui . Então você tem duas opções:

  1. Adicione as colunas adicionais à GROUP BYcláusula:

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. Adicione alguma função agregada nas colunas relevantes:

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

A segunda solução é principalmente uma solução alternativa e uma indicação de que você deve corrigir algo mais geral com sua consulta.

Lukas Eder
fonte
"No SQL Server, você só pode selecionar colunas que fazem parte da cláusula GROUP BY ou agregar funções em qualquer uma das outras colunas ..." é algo que eu estava procurando. Thnx
Irfan
NOTA: essas duas opções podem fornecer resultados absolutamente ERRADOS! GROUP BY A,B,Cpode ser totalmente diferente do que você deseja obter em comparação GROUP BY A. e também, geralmente não podemos usar alguma função agregada para obter o valor da coluna relacionada. verifique esta resposta como solução
S.Serpooshan
2

Nota: Esta resposta pretende complementar a resposta de @Lukas Eder

Se houver vários valores presentes para os campos SELECTed, mas um campo que você desejar GROUP BY, você poderá pegar a linha superior correspondente, em vez de esperar que uma agregação ( MAX) retorne.

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

se você deseja que TODOS os valores retornem nessas outras colunas, mas deseja recolhê-lo em uma única entrada, consulte: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-sql /

mpag
fonte