Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

je veux obtenir toutes les colonnes de la table des comptes avec cette requête mais cela donne une erreur

Votre requête contient une clause group by. Si vous utilisez une clause group by dans la requête, chaque colonne de l'instruction select doit faire l'une des deux choses suivantes :soit elle doit faire partie de la liste group by, soit elle doit être un agrégat quelconque (Sum , Compte, Moy, Max, etc.). Si vous ne le faites pas, SQL ne sait pas quoi faire de la colonne. Dans votre cas, Accounts.regno et Accounts.model sont répertoriés dans la sélection, mais ils ne sont pas dans la clause group by et ne sont pas des agrégats - d'où votre erreur.

Supposons pour le moment que vous ayez deux enregistrements de compte avec le même nom de compte et slacc, mais Regno (ou modèle) différent. La clause group by indique qu'ils doivent être joints en un seul enregistrement pour l'affichage, mais vous n'avez pas indiqué à SQL comment procéder. Peu importe si les données ne sont pas comme ça, SQL recherche d'abord les erreurs possibles.

Dans ce cas, vous voulez probablement que tous les détails soient regroupés. Le moyen le plus simple consiste simplement à vous assurer d'ajouter toutes les colonnes nécessaires au groupe par, comme ceci

select Accounts.name, Accounts.regno, Accounts.model, Accounts.slacc, count(servicing.dt) as total 
from Accounts 
   left outer join servicing on Accounts.slacc = servicing.slacc 
group by Accounts.slacc, Accounts.name, Accounts.regno, Accounts.model

Cela corrigera l'erreur, mais fait un groupement supplémentaire dont vous n'avez pas besoin et deviendrait très fastidieux si vous aviez beaucoup plus de colonnes que vous vouliez du compte, car vous devriez toutes les ajouter. Une autre façon de gérer cela consiste à utiliser le nombre minimum de colonnes pour la requête de groupe, puis à joindre le résultat de celle-ci à votre requête principale pour obtenir les autres colonnes. Cela ressemblerait probablement à quelque chose comme ça

select Accounts.name, Accounts.regno, Accounts.model, Accounts.slacc, Totals.Total 
from Accounts
   left outer join 
     ( Select slacc, count(dt) as total
       from servicing
       group by slacc
     ) Totals on Totals.slacc = Accounts.slacc