Як вибрати кілька стовпців, але лише групувати по одному?


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;

Відповіді:


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. а також, як правило, ми не можемо використовувати якусь сукупну функцію для отримання відповідного значення стовпця. перевірити цю відповідь як рішення
С.Серпоошан

2

Примітка. Ця відповідь призначена як доповнення до відповіді @ Лукаса Едера

Якщо для полів SELECTредагування є декілька значень, але поле, яке ви хочете 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 /

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.