2011-05-09 5 views
4

Quelle est la meilleure façon de faire la requête T-SQL valide suivante:Groupe par une sous-requête

select 
    count(*), 
    (... a subquery that returns one result ...) as [Bar] 
from Foo foo 
group by [Bar] 
+2

S'il vous plaît expliquer ce que la requête est censé faire. –

+0

Son censé être le regroupement par le résultat d'une sous-requête. Je l'ai simplifié pour que vous n'ayez pas à lire autant. – cbp

+0

@cbp - croyez-moi, Martin le sait * beaucoup *. Peut-être pourriez-vous poster des exemples de données et de résultats attendus. Cela éclaircirait les choses. Pour commencer, je ne vois aucune raison pour laquelle vous incluez la table 'Office'. Cela me semble redondant. –

Répondre

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) 

donne l'erreur

Impossible d'utiliser un agrégat ou d'un sous-requête dans une expression utilisée pour le groupe par liste d'une clause GROUP BY.

Peut-être que quelqu'un d'autre peut répondre pourquoi cela n'est pas autorisé. Un couple de façons valables

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 

et

;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