Group by subquery

What is the best way to make the following T-SQL valid:

 select count(*), (... a subquery that returns one result ...) as [Bar] from Foo foo group by [Bar] 
+4
source share
1 answer
 SELECT COUNT(*), (SELECT TOP 1 name FROM sys.objects ORDER BY object_id%number) name FROM master..spt_values WHERE number > 0 GROUP BY (SELECT TOP 1 name FROM sys.objects ORDER BY object_id%number) 

Gives an error

You cannot use an aggregate or subquery in an expression used for a group on a GROUP BY clause list.

Maybe someone can answer why this is not allowed. Several ways that are valid

 SELECT COUNT(*), oa.name FROM master..spt_values OUTER APPLY (SELECT TOP 1 name from sys.objects ORDER BY object_id%number) oa WHERE number > 0 GROUP BY oa.name 

and

 ;WITH T AS ( SELECT number, (SELECT TOP 1 name from sys.objects ORDER BY object_id%number) name FROM master..spt_values WHERE number > 0 ) SELECT COUNT(*), name FROM T GROUP BY name 
+7
source

All Articles