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

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

Примечание. Этот ответ является дополнением к ответу @Lukas Eder.

Если существует несколько значений для полей SELECTed, но поле, которое вы хотитеGROUP BY , вы можете вместо этого взять верхнюю совпадающую строку, вместо того, чтобы ждать MAXвозврата aggregation ( ).

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 /

МПа
источник