Le groupe SQL Server par/ de la commande par
J'ai la requête suivante
select
datepart(yy, orderDate) as 'year',
datename(mm, OrderDate) as 'month',
count(*) as 'Orders'
from orders (yeah I know its missing the schema, its from a book)
group by
datepart(yy, orderdate),
datename(mm, orderdate)
order by
datepart(yy, orderdate),
datename(mm, orderdate);
qui renvoie 3 colonnes mais datename(mm, orderdate)
retourne une chaîne de caractères et donc de la commande par il met en août, avant janvier etc.
La solution à ce problème est la suivante:
select
datepart(yy, orderDate) as 'year',
datename(mm, OrderDate) as 'month',
count(*) as 'Orders'
from orders (yeah i know its missing the schema, its from a book)
group by
datepart(yy, orderdate),
datename(mm, orderdate),
datepart(mm, orderdate)
order by
datepart(yy, orderdate),
datepart(mm, orderdate);
Je suis encore un peu confus avec le groupe en entier /de la commande par sections et comment il fonctionne réellement.
Que ce que j'ai compris, groupe par la création d'une table de travail avec 4 colonnes (qui peut être erroné) datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate)
, et un count
colonne.
Chaque fois qu'il rencontre un orderdate
qu'il a dans la table de travail, il augmente le comte,
sinon, il ajoute une nouvelle ligne?
À l'origine, je pensais que je pouvais enlever la DateName(mm, orderdate)
dans le groupe par la section mais le livre dit que ce n'est pas possible.
Si quelqu'un pouvait étape à travers ce qui se passe réellement derrière les coulisses/point une ressource qui explique comment cela fonctionne en détail un peu plus de l'id de l'apprécier.
merci pour votre aide.
Je suis tout à fait confus quant à la façon dont cela fonctionne, et à l'origine je pensais que je pouvais enlever la DateName du Groupe Par la section.
order by orderdate
ne fonctionne pas? Ou à l'aide de datepart
plutôt que datename
dans le order
clause?Afficher un exemple du résultat souhaité.
OriginalL'auteur Hans Rudel | 2012-06-07
Vous devez vous connecter pour publier un commentaire.
Tout moment vous utilisez une fonction d'agrégation (COUNT,SUM,MAX,...). vous devez inclure toutes les autres colonnes dans la clause GROUP BY. Dans l'exemple retourne le nombre d'enregistrements qui ont la même valeur pour
datepart(yy, orderdate)
,datename(mm, orderdate)
,datepart(mm, orderdate)
.Un exemple:
Dire cette retourné:
Si vous avez changé votre requête:
Il serait de retour:
Notez que j'ai ajouté une fonction d'Agrégation à
col3
(MIN) j'ai donc été en mesure de supprimercol3
de mon clause GROUP BY.Il n'a vraiment pas d'importance combien de colonnes de la table a, il importe de combien vous les sélectionnant et en combien de ces colonnes sélectionnées ont une fonction d'agrégation appliquée.
Une dernière question, si j'ai enlevé le count(*) de l'instruction select, je voudrais juste avoir 2 colonnes retournées, et ils pourraient être commandés comme ils étaient avant droit? (Im en supposant que je devrais utiliser Distinct() à la place).
Avez-vous réellement dire la deuxième requête retourne
1,2,3,18
?Nope. Je suis en train de faire le MAX sur la dernière colonne, pas une SOMME.
OriginalL'auteur Abe Miessler