Comment puis-je sélectionner les colonnes avec des fonctions d'agrégation?
Disons que j'ai une table de sociétés:
Company
coID | coName | coCSR
La coCSR
domaine est un IDENTIFIANT numérique qui concerne le compte de gestionnaire de table:
AccountHandler
ahID | ahFirstName | ahLastName
J'ai aussi une table de commandes:
Order
orID | orCompanyID | orDate | orValue
Maintenant ce dont j'ai besoin pour produire de l'est de sortie structuré comme suit:
Company | Account handler | No. of orders | Total of orders
Voici la requête que j'ai essayé, ce qui produit une erreur:
SELECT coID, coName, ahFirstName+' '+ahLastName AS CSRName, COUNT(orID) AS numOrders, SUM(orValue) AS totalRevenue
FROM Company
LEFT JOIN AccountHandler ON coCSR = ahID
LEFT JOIN Order ON coID = orCompanyID
WHERE coCSR = 8
AND orDate > getdate() - 365
ORDER BY coName ASC
L'erreur est: nom de Colonne 'AccountHandler.ahLastName' est pas valide dans la clause ORDER BY, car il n'est pas contenue dans une fonction d'agrégation et il n'y a pas de clause GROUP BY.
Si j'utilise GROUP BY coID
, je reçois syntaxe Incorrecte près du mot clé "OÙ". Si je change le WHERE
à HAVING
en raison des fonctions d'agrégation, j'obtiens une erreur me disant de supprimer tous les autres noms de colonnes qui ne sont pas contenues dans une fonction d'agrégation ou de la clause GROUP BY.
Je dois l'avouer, je n'ai pas encore de comprendre la logique et la syntaxe de rien, mais la plupart des commandes SQL de base, je suis juste essayer d'appliquer ce que j'ai vu utilisé avant, et ça ne fonctionne pas. Merci de m'aider à faire ce travail. Mieux encore, pouvez-vous m'aider à comprendre pourquoi il ne fonctionne pas en ce moment? 🙂
GROUP BY
doit être après WHERE
mais avant ORDER BY
J'ai mis le
GROUP BY
juste avant la ORDER BY
et obtenez le message d'erreur: la Colonne " AccountHandler.ahLastName' est pas valide dans la liste de sélection, car il n'est pas contenue dans une fonction d'agrégation ou de la clause GROUP BYBon d'accord, c'est marqué que
SQL Server
: Peut-on obtenir un COUNT ... OVER (PARTITION BY ...)
réponse? s'il vous Plaît jolie s'il vous plaît? (SQL Server prend en charge de nombreux gentil "fenêtre" que certaines autres bases de données manque.)OriginalL'auteur Kalessin | 2012-06-22
Vous devez vous connecter pour publier un commentaire.
Pour une chose, votre requête est probablement manquant
FROM Company
, mais qui pourrait en quelque sorte avoir été perdu lorsque vous rédigez votre message.Vous semblez être de l'agrégation des données par les entreprises. Par conséquent, vous avez besoin de regrouper par les entreprises. La raison la plus probable pour laquelle votre tentative de regroupement a échoué peut-être parce que vous mettez
GROUP BY
dans le mauvais endroit. Je pense que vous l'avez mis avantWHERE
, mais en fait, il devrait aller après (et avantORDER BY
):Autre question: est - ce de groupe. SQL Server exige que tous les non-agrégés des colonnes spécifiées dans
GROUP BY
. Par conséquent, votreGROUP BY
clause devrait ressembler à ceci:Notez que vous ne pouvez pas faire référence à des colonnes par des alias qui leur est attribué dans la
SELECT
de l'alinéa (par exempleCSRName
). Mais vous pouvez utiliser laahFirstName+' '+ahLastName
expression à la place des colonnes correspondantes, il ne serait pas faire une différence dans cette situation particulière.Si jamais vous avez besoin d'ajouter plus de non-agrégées colonnes à cette requête, vous devrez les ajouter à la fois à
SELECT
et àGROUP BY
. À un certain point cela peut devenir un peu fastidieux. Je vous suggère d'essayer ce qui suit:Qui est, l'agrégation est effectuée sur la
Order
table seulement. Les agrégés ligne est ensuite joint aux autres tables. Vous pouvez maintenant tirer plus d'attributs pour la sortie à partir deCompany
ouAccountHandler
sans se soucier de les ajouter àGROUP BY
parce que le groupement n'est pas nécessaire à ce niveau.Mon mauvais. J'ai raté la virgule après le premier
ISNULL
. Merci beaucoup!OriginalL'auteur Andriy M
Pouvez-vous modifier la requête comme celle ci-dessous? Vous devez ajouter
Max
etGroup By Clause
Ma Suggestion
Vous devez utiliser des Alias pour la Colonne sélectionnée, les Noms de
Aussi, ne pas
MAX
seul le retour un seul enregistrement? J'ai besoin d'eux tous.Il dépend de la Clause Group By. Si le Nom de la Société est de regroupement d'enregistrements. Oui, seul l'ID d'Entreprise est venue Max dans la requête.
Pourquoi ne pas simplement groupe sur les colonnes? À l'aide de MAX, comme cela peut conduire à des silencieux de perte de données.
Regardez à nouveau la requête La Requête est en Groupe par la Société. Même le Nom de la société va se répéter plusieurs commandes. De sorte que groupe Spécifique est utilisé pour obtenir le Max d'identification de l'Entreprise. Tous les ID de société de ce Groupe ont le même ID d'Entreprise. Donc, il va encore vous donner de la correcte identification de l'Entreprise sans perte de données.
OriginalL'auteur eddedeed
Vous avez deux fonctions d'agrégation ; un
COUNT
et unSUM
; cela signifie que vous êtes tenu de faire certains regroupements et la règle générale estGROUP BY
les non agrégés section de la clause selectLe très gros problème dans votre OP, c'est que lorsque vous JOINDRE deux tables, quelle que soit la saveur (à GAUCHE, à DROITE, EXTÉRIEURE, INTÉRIEURE, de la CROIX), il doit être dans la clause from et a besoin d'une table spécifiée sur chaque côté de la jointure
Alors si la liaison de plusieurs tables, vous pourriez utiliser des alias pour chacune des tables; j'ai juste utilisé une seule lettre minuscule; c/o/un. Bien que regardant votre colonne les noms de ces peut-être pas nécessaire que toutes les colonnes sont nommées uniques.
OriginalL'auteur whytheq