按子查询分组

cbp*_*cbp 4 sql t-sql group-by

使以下T-SQL查询有效的最佳方法是什么:

select
    count(*),
    (... a subquery that returns one result ...) as [Bar]
from Foo foo
group by [Bar]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 7

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)
Run Code Online (Sandbox Code Playgroud)

给出错误

无法在GROUP BY子句列表中使用的表达式中使用聚合或子查询.

也许其他人可以回答为什么不允许这样做.有两种方法是有效的

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  
Run Code Online (Sandbox Code Playgroud)

;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
Run Code Online (Sandbox Code Playgroud)