Pourquoi ne puis-je pas effectuer une fonction d'agrégation sur une expression contenant un agrégat, mais je peux le faire en créant une nouvelle instruction select autour d'elle?
Pourquoi est-il que dans SQL Server, je ne peux pas faire ça:
select sum(count(id)) as 'count'
from table
Mais je peux faire
select sum(x.count)
from
(
select count(id) as 'count'
from table
) x
Sont-ils pas essentiellement la même chose? Comment suis-je censé être de penser à ce sujet afin de comprendre pourquoi le premier bloc de code n'est pas autorisé?
- La première façon dont devrait fonctionner aussi. Quelle est l'erreur que vous obtenez?
- soins à part l'erreur que vous obtenez lorsque vous exécutez d'abord sql. Il doit s'exécuter correctement.
- Une Agrégation Scalaire (Pas de
GROUP BY
) renvoie toujours exactement une ligne. Dans quelles circonstances serait-il judicieux d'appliquer une agrégation pour qu'une ligne? Un vecteur d'agrégation retourne une ligne par groupe. Alors que parfois il peut être utile d'appliquer une autre agrégation, à la suite de cela, vous auriez besoin d'un autreGROUP BY
appliquée pour les deux agrégats pour que cela soit utile. - Bien qu'ayant dit qu'il ressemble à Sybase permet cela et juste suppose implicitement que l'agrégat externe est un scalaire
- La Norme SQL-92 interdit explicitement l'imbrication des agrégats de La
<value expression>
simplement contenues dans<set function specification>
ne doit pas contenir un<set function specification>
ou un<subquery>
- Mis simplement,
aggregate(aggregate(...))
est impossible car il n'y a aucun moyen de spécifierGROUP BY ... OVER (GROUP BY ...)
. I. e. si nous voulions nid agrégats, nous devons aussi être en mesure de nid GROUPE BYs, que nous n'avons pas été autorisés (encore?). Vous dites il n'y a pas de GROUPE BYs dans votre exemple? Mais il y a, à savoirGROUP BY ()
, qui est toujours implicite lorsqu'il n'est pas spécifié explicitement. - Pourquoi j'ai une erreur quand je fais seulement - ( select count(id) as 'count' partir de la table ) x ?
Vous devez vous connecter pour publier un commentaire.
SOMME() dans votre exemple, un no-op - SOMME() d'un COUNT() qui signifie la même chose que juste COUNT(). Donc ni de votre exemple de requêtes apparaissent à faire quelque chose d'utile.
Il me semble que l'imbrication des agrégats n'a de sens que si vous vouliez appliquer deux différentes agrégations - sens de GROUPE sur différents ensembles de colonnes. Pour spécifier deux agrégations vous devez utiliser les regroupements en fonction ou SUM() PLUS de fonctionnalité. Peut-être que si vous expliquez ce que vous voulez atteindre quelqu'un pourrais vous montrer comment.
L'essentiel de la question est qu'il n'y a pas de notion de l'agrégation d'un ensemble appliqués à un rapport, voir L'agrégation. Avoir un tel concept serait de laisser trop de trous dans la définition et rend la clause GROUP BY, impossible à exprimer: il doit définir à la fois l'agrégat interne clause GROUP BY et l'agrégat externe ainsi! Cela s'applique également pour les autres attributs, comme la clause HAVING.
Toutefois, le résultat d'une agrégation appliquée à une relation est une autre relation, et c'est une relation à son tour, peut prendre en charge un nouvel opérateur d'agrégation. C'est ce qui explique pourquoi vous pouvez regrouper le résultat d'une sélection externe. Cela laisse aucune ambiguïté dans la définition, chacune a son propre GROUPE PAR/HAVING.
En termes simples, l'agrégation des fonctions de fonctionner sur une colonne et de générer une valeur scalaire, donc ils ne peuvent pas être appliqué sur leur résultat. Lorsque vous créez une instruction select sur une valeur scalaire vous transformer dans un artificiel de la colonne, c'est pourquoi il peut être utilisé par une fonction d'agrégation de nouveau.
Veuillez noter que la plupart du temps il n'y a aucun point dans l'application d'une fonction d'agrégation sur le résultat d'une autre fonction d'agrégation: dans votre exemple
sum(count(id)) == count(id)
.je voudrais savoir ce que votre résultat attendu dans ce sql
lorsque vous utilisez le
count
fonction, seulement 1 résultat(nombre total) seront de retour. Donc, puis-je vous demander pourquoi vous souhaitez somme le seul 1 résultat.Vous aurez sûrement eu l'erreur, car une fonction d'agrégation ne peut pas effectuer sur une expression contenant un agrégat ou une sous-requête.
C'est de travailler pour moi à l'aide de SQLFiddle, ne sais pas pourquoi il ne serait pas travailler pour vous. Mais j'ai une explication des raisons pour lesquelles il pourrait ne pas fonctionner pour vous et pourquoi l'alternative serait de travailler...
Votre exemple, à l'aide d'un mot clé comme nom de colonne, qui peut ne pas toujours fonctionner. Mais lorsque la colonne est seulement dans une sous-expression, le moteur de requête est libre d'ignorer le nom (en fait, il probaly ne) donc le fait qu'elle peut potentiellement en conflit avec un mot-clé peut être ignoré.
EDIT: en réponse à votre modifier/commentaire. Non, les deux ne sont pas équivalents. Le RÉSULTAT serait l'équivalent, mais le processus d'obtention de ce résultat n'est pas tout à fait similaire. Pour le premier de travailler, l'analyseur a faire un peu de travail qui n'a tout simplement pas de sens pour elle de le faire (application d'un agrégat à une valeur unique, soit ligne par ligne ou dans le), dans le second cas, un total est appliqué à un tableau. Le fait que la table est temporaire table virtuelle sera sans importance pour la fonction d'agrégation.
Je pense que vous pouvez écrire la requête sql, qui produit "comte" de lignes pour la sortie requise. Les fonctions ne prennent pas agrégées des fonctions comme "somme" ou agrégées sous-requête. Mon problème a été résolu par l'utilisation d'une simple requête sql pour obtenir le nombre de sortie....
Vous pouvez contourner ce problème en utilisant un
Derived
table:Sur l'autre main à l'aide du code ci-dessous vous donnera un message d'erreur.