web-dev-qa-db-ja.com

複数の列を選択して1つだけグループ化する方法は?

group byに問題があります。複数の列を選択したいのですが、1つの列だけでグループ化したいのですが。以下のクエリは私が試したものですが、エラーが発生しました。

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;
14
Nayeem Mansoori

SQL Serverでは、GROUP BY句の一部である列、または他の列の集計関数のみを選択できます。 これについては、こちらで詳しくブログしています 。したがって、2つのオプションがあります。

  1. GROUP BY句に列を追加します。

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
    
  2. 関連する列に集計関数を追加します。

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

2番目の解決策は主に回避策であり、クエリでより一般的なものを修正する必要があることを示しています。

19
Lukas Eder

注:この回答は @ 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 /

2
mpag