Birden çok sütun nasıl seçilir, ancak yalnızca bir tane gruplandırılır?


14

Bir sorunum var group by, birden çok sütun seçmek istiyorum ama sadece bir sütuna göre gruplandırmak. Aşağıdaki sorgu ne denedim, ama bana bir hata verdi.

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;

Yanıtlar:


19

SQL Server'da yalnızca GROUP BYyan tümcenin parçası olan sütunları seçebilir veya diğer sütunların herhangi birindeki işlevleri toplayabilirsiniz . Burada ayrıntılı olarak blog yazdım . Yani iki seçeneğiniz var:

  1. Maddeye ek sütunlar ekleyin GROUP BY:

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. İlgili sütunlara birleştirme işlevi ekleyin:

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

İkinci çözüm çoğunlukla bir geçici çözüm ve sorgunuzla daha genel bir şeyi düzeltmeniz gerektiğinin bir göstergesidir.


"SQL Server'da yalnızca GROUP BY deyiminin bir parçası olan sütunları seçebilir veya diğer sütunların herhangi birindeki işlevleri toplayabilirsiniz ..." aradığım şey budur .. Thnx
Irfan

NOT: bu iki seçenek kesinlikle YANLIŞ sonuçlar sağlayabilir! GROUP BY A,B,Cile karşılaştırmak istediğiniz şeyden tamamen farklı olabilir GROUP BY A. ayrıca, genellikle ilgili sütun değerini almak için bazı toplama işlevini kullanamayız. Bu yanıtı bir çözüm olarak kontrol edin
S.Serpooshan

2

Not: Bu cevap @Lukas Eder'in cevabına ek olarak tasarlanmıştır

SELECTEd alanları ancak istediğiniz bir alan için birden çok değer GROUP BYvarsa, bunun yerine bir toplamanın ( MAX) geri dönmesini beklemek yerine en iyi eşleşen satırı yakalayabilirsiniz .

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

TÜM değerlerin bu diğer sütunlara dönmesini istiyorsanız, ancak tek bir girişe daraltmak istiyorsanız, bkz: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-sQL /

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.