如何选择多个列但只能按一个列分组?


14

我有一个问题group by,我想选择多列,但仅按一列分组。下面的查询是我尝试的,但是给了我一个错误。

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;

Answers:


19

在SQL Server中,您只能选择属于该GROUP BY子句的列,或者在其他任何列上聚合函数。我在这里详细介绍了此博客。因此,您有两种选择:

  1. GROUP BY子句中添加其他列:

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. 在相关列上添加一些聚合函数:

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

第二种解决方案主要是一种变通办法,它表明您应该对查询进行更一般的修复。


“在SQL Server中,您只能选择属于GROUP BY子句的列,或者在其他任何列上聚合函数...”是我一直在寻找的东西。Thnx
Irfan

注意:这两个选项绝对可以提供错误的结果!GROUP BY A,B,C与您想要得到的比较可能完全不同GROUP BY A。而且,通常我们不能使用一些聚合函数来获取相关的列值。检查此答案作为解决方案
S.Serpooshan 18/12/25

2

注意:此答案是对@Lukas Eder答案的补充。

如果SELECTed 字段中存在多个值,而您想要的字段中存在多个值GROUP BY,则可以选择最上面的匹配行,而不用等待聚集(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

如果您希望所有值都在其他列中返回,但又希望将其折叠为单个条目,请参见:https : //www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-sql /

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.