Come selezionare più colonne ma raggrupparne solo una?


14

Ho un problema con group by, voglio selezionare più colonne ma raggrupparle per una sola colonna. La query qui sotto è ciò che ho provato, ma mi ha dato un errore.

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;

Risposte:


19

In SQL Server è possibile selezionare solo colonne che fanno parte della GROUP BYclausola o funzioni aggregate su una qualsiasi delle altre colonne. Ho scritto questo blog in dettaglio qui . Quindi hai due opzioni:

  1. Aggiungi le colonne aggiuntive alla GROUP BYclausola:

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. Aggiungi alcune funzioni di aggregazione sulle colonne pertinenti:

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

La seconda soluzione è principalmente una soluzione alternativa e un'indicazione che è necessario correggere qualcosa di più generale con la query.


"In SQL Server è possibile selezionare solo colonne che fanno parte della clausola GROUP BY o funzioni aggregate su una qualsiasi delle altre colonne ..." è qualcosa che stavo cercando .. Thnx
Irfan

NOTA: queste due opzioni possono fornire risultati assolutamente ERRATI! GROUP BY A,B,Cpuò essere totalmente diverso da quello che si desidera ottenere in confronto GROUP BY A. e inoltre, di solito non possiamo usare alcune funzioni aggregate per ottenere il valore di colonna correlato. controlla questa risposta come soluzione
S. Serpooshan il

2

Nota: questa risposta è intesa come supplemento alla risposta di @Lukas Eder

Se per i campi sono presenti più valori SELECTma un campo si desidera GROUP BY, è possibile invece afferrare la riga di corrispondenza superiore, anziché attendere il MAXritorno di un'aggregazione ( ).

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 vuoi che TUTTI i valori ritornino in quelle altre colonne, ma vuoi comprimerlo in una singola voce, consulta: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-SQL /

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.