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


14

に問題が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;

回答:


19

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


「SQL Serverでは、GROUP BY句の一部である列、または他の列の集計関数のみを選択できます...」を探していました。Thnx
Irfan

注:これら2つのオプションは、まったく間違った結果をもたらす可能性があります!GROUP BY A,B,Cと比較して取得したいものとはまったく異なる場合がありますGROUP BY A。また、通常、集計関数を使用して関連する列の値を取得することはできません。ソリューションとしてこの答えを確認してください
S.Serpooshan

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 /

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.